Pandas - 导入大小为 4GB 的 CSV 文件时出现内存错误

Posted

技术标签:

【中文标题】Pandas - 导入大小为 4GB 的 CSV 文件时出现内存错误【英文标题】:Pandas - memory error while importing a CSV file of size 4GB 【发布时间】: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.5GB - 成功导入 尝试使用 4GB 的文件大小 - 失败(内存错误) 尝试使用低 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。 【参考方案1】:

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

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

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

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

【讨论】:

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

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

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

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

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

【讨论】:

以上是关于Pandas - 导入大小为 4GB 的 CSV 文件时出现内存错误的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 文件导入为 pandas DataFrame

Pandas:如何比较导入的 csv 文件的列以确保它们相同?

分块读取 Pandas 中的多个 CSV 文件

pandas 导入导出

使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧

用pandas导入csv表格后,怎么指定那一列是index