pandas read_csv内存消耗

时间:2017-01-01 13:45:02

标签: python-3.x pandas memory memory-management out-of-memory

我正在阅读庞大的Pandas(版本18.1,故意)以csv格式存储的DataFrame(〜总计30 GB)。然而,使用read_csv,内存消耗增长到初始csv的两倍。文件 - > 60 GB。我知道chunksize参数。然而,这种方式较慢,并没有真正减少内存使用量。我尝试使用4 GB DataFrame。读完DataFrame后,脚本仍然消耗了大约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可以节省内存。所以这是我的问题。读大熊猫DataFrames的最佳方式(性能,内存)是什么?

2 个答案:

答案 0 :(得分:0)

根据您要对数据框执行的操作类型,您可能会发现dask非常有用。其主要功能之一是允许在大于内存的数据帧上进行操作。例如,要在大于内存的数据帧上执行groupby:

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

请注意,与典型的pandas compute()操作相比,最后添加了groupby

答案 1 :(得分:0)

您使用的chunksize错误。它不用于简单地以块的形式附加到数据帧。您必须将数据集分成多个部分,以便可以一次处理一个大数据集。这样,只有正在处理的块才需要保留在内存中。

使用dtypesusecols是减少内存使用的最佳方法。

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

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