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 文件时出现内存错误的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:如何比较导入的 csv 文件的列以确保它们相同?