【问题标题】:Pandas - memory error while importing a CSV file of size 4GBPandas - 导入大小为 4GB 的 CSV 文件时出现内存错误
【发布时间】:2019-10-19 19:02:33
【问题描述】:

我尝试使用 pd.read_csv 导入大小为 4GB 的 csv 文件,但收到内存不足错误。然后尝试使用dask.dataframe,但无法转换为pandas dataframe(同样的内存错误)。

import pandas as pd
import dask.dataframe as dd
df = dd.read_csv(#file)
df = df.compute()

然后尝试使用chunksize参数,但是同样的内存错误:

import pandas as pd
df = pd.read_csv(#file, chunksize=1000000, low_memory=False)
df = pd.concat(df)

还尝试将chunksize 与列表一起使用,同样的错误:

import pandas as pd
list = []
for chunk in pd.read_csv(#file, chunksize=1000000, low_memory=False)
    list.append(chunk)
df = pd.concat(list)

尝试:

  1. 已尝试文件大小为 1.5GB - 成功导入
  2. 尝试使用 4GB 的文件大小 - 失败(内存错误)
  3. 尝试使用低 chunksize(2000 或 50000) - 失败(4GB 文件的内存错误)

请告诉我下一步该怎么做?

我使用 python 3.7 和 8GB 内存。

我还在 RAM 128GB 的​​服务器上尝试了尝试 3,但仍然memory error

我无法分配dtype,因为要导入的 csv 文件可以在不同的时间包含不同的列

【问题讨论】:

  • 读取一个块然后将其存储在列表中list.append(chunk) 没有任何意义(因为该列表占用了您的记忆)。在加载下一个之前,您需要在加载它(聚合它、过滤它或其他)时处理该块。恕我直言,128gb 服务器应该可以工作。我的猜测是某些东西限制了你的进程的内存(docker?)
  • 我不想(聚合、过滤或其他)块,我只想附加所有块并从中构建一个完整的dataframe。我将使用整个dataframe 使用GUI toolkit 进行过滤和聚合的帖子
  • 你没有足够的内存来做这件事。想象一下,您有一个可容纳 100 本书(您的内存)的书架,并且您想要容纳 200 本书。如果你 read_csv() 没有块大小。您一次拿走所有 200 本书并将它们放在那里 - 它们不适合。如果你设置chunksize 你一次拿10本书,把它们放在那里。 10 轮后,你的书架上没有空间了,所以你的内存用完了。
  • “我还在一台 RAM 为 128GB 的​​服务器上尝试了尝试 3,但仍然出现内存错误”我觉得这很令人惊讶。您是否偶然使用了 32 位版本的 Python?
  • 那是您的问题,您将无法访问超过 32 位的地址空间,因此 最大 大约为 4gb,尽管许多操作系统将其限制为更少。例如,Windows 上的限制为 2 GB。

标签: python python-3.x pandas


【解决方案1】:

这里已经回答了: How to read a 6 GB csv file with pandas

我也用 2GB 的文件尝试了上述方法,它可以工作。

同时尽量保持块的大小更小。

你能不能也分享一下你的系统配置,那会很有用

【讨论】:

  • 欢迎来到 SO,尼沙尔!我建议您阅读 OP 下的 cmets。我们发现降低块大小不会完成任何事情,而 128GB ram 服务器的问题是由于 OP 使用 32 位 Python。
【解决方案2】:

我只是想在得到足够的建议后记录我的尝试!感谢 Robin Nemeth 和 juanpa

  1. 正如 juanpa 指出的那样,我能够读取 csv 文件 (4GB) 当我使用 64bit python 可执行文件时,服务器具有 128GB RAM

  2. 正如 Robin 指出的那样,即使使用 64 位可执行文件,我也无法 使用 8GB RAM 在我的本地计算机中读取 csv 文件 (4GB)。

所以,无论我们尝试什么,机器的 RAM 都很重要,因为数据帧在内存中使用

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2018-11-08
    • 2019-04-28
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 2018-08-25
    • 2013-12-19
    相关资源
    最近更新 更多