【发布时间】: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。
标签: python python-3.x pandas