Pandas读取CSV文件的内存消耗

6

我正在阅读以csv格式存储的巨大Pandas(版本18.1)数据框(约达30 GB)。然而,使用read_csv时,内存消耗增加到初始csv文件的两倍——> 60 GB。我知道有chunksize参数。然而,这种方法速度更慢,并没有真正减少内存使用量。我已经尝试过使用4 GB的数据框来测试它。在读取数据框之后,脚本仍然占用了约7 GB的RAM。以下是我的代码:

df = None

for chunk in pandas.read_csv(fn, chunksize=50000):
        if df is None:
                df = chunk
        else:
                df = pandas.concat([df, chunk])

这只是一个简短的版本。我也知道指定dtype可以节省内存。那么我的问题来了。读取巨大的pandas数据帧的最佳方式(性能,内存)是什么?


1
尝试这样做:df = pd.concat((x for x in pd.read_csv(fn, chunksize=50000)) - MaxU - stand with Ukraine
1
我试过了。不幸的是,这并没有改变任何事情。 - Hansi
1
一年过去了,我现在使用的是0.22版本。看起来这个问题仍然没有解决...当我读取一个大约7G的csv文件时,我遇到了类似的内存错误。奇怪的是,在我的16G内存的MacBook上,它可以正常工作。但是在我的32G内存的Ubuntu17上,它却抛出了“内存错误”。在我的MacBook上,最终的数据框架显示为大约11G,这是有道理的...有人能帮我理解吗? - user3768495
2个回答

2

根据您想在数据帧上执行的操作类型,您可能会发现dask很有用。它的一个关键功能是允许对大于内存的数据帧进行操作。例如,要在大于内存的数据帧上进行groupby操作:

 import dask.dataframe as dd
 df = dd.read_csv(fn)
 df_means = df.groupby(key).mean().compute()

请注意,在典型的pandas groupby操作中,需要在结尾处添加compute()

1

你正在错误地使用 chunksize。它不是用来简单地分块追加到数据帧中的。你需要将数据集分成几块,以便一次处理大型数据集的一部分。这样,只有正在处理的块需要留在内存中。

使用 dtypesusecols 是降低内存使用的最佳方法。

很难说,因为你没有提供有关数据集的任何详细信息,例如行数、行大小、列数据类型、列数、是否是干净和结构化的数据等等。如果你的列中的数据不一致,它可能会导致意外的向上转型和内存峰值。因此,在加载数据帧之前,你可能需要对其进行预处理。

  • 考虑使用 category 数据类型来处理基数低、选择性低的对象/字符串列。
  • 使用 dtypes 降低数字列的精度。
  • 使用 chunksize 分块处理数据,而不仅仅是追加数据。或者使用dask。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接