Python 3.x 熊猫读取csv内存消耗

Python 3.x 熊猫读取csv内存消耗,python-3.x,pandas,memory,memory-management,out-of-memory,Python 3.x,Pandas,Memory,Memory Management,Out Of Memory,我正在阅读以csv格式(总计30 GB)存储的大熊猫(18.1版)数据帧。但是,使用read_csv时,内存消耗会增加到初始csv的两倍。文件-->60 GB。我知道chunksize参数。然而,这是慢得多,并没有真正减少内存使用。我用4GB的数据帧试过了。读取数据帧后,脚本仍消耗约7 GB RAM。这是我的密码: df = None for chunk in pandas.read_csv(fn, chunksize=50000): if df is None:

我正在阅读以csv格式(总计30 GB)存储的大熊猫(18.1版)数据帧。但是,使用read_csv时,内存消耗会增加到初始csv的两倍。文件-->60 GB。我知道
chunksize
参数。然而,这是慢得多,并没有真正减少内存使用。我用4GB的数据帧试过了。读取数据帧后,脚本仍消耗约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])

这只是一个简短的版本。我还知道,指定数据类型可以节省内存。这是我的问题。读取大熊猫数据帧的最佳方式(性能、内存)是什么?

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

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

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

您使用的
chunksize
不正确。它不是用来简单地以块的形式附加到数据帧。您必须将数据集分解为多个部分,以便一次只处理一个大型数据集。这样,只有正在处理的块需要留在内存中

使用
dtypes
usecols
是减少内存使用的最佳方法

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

  • 考虑对任何对象/字符串使用
    类别
    数据类型 具有低基数和低选择性的色谱柱
  • 使用
    dtypes
    降低数值列的精度
  • 使用
    chunksize
    以块的形式处理数据,而不仅仅是附加数据。或者使用dask

试试这个:
df=pd.concat((在pd.read\u csv中x代表x(fn,chunksize=50000))
我试过了。不幸的是,这并没有改变任何事情。一年后,我使用的是0.22版。似乎这仍然是一个没有解决的问题…我在读取~7G csv文件时遇到了类似的内存错误。奇怪的是,在16G内存的MacBook上,它工作正常。但在32G内存的Ubuntu17上,它抛出了“内存错误”。最后的数据帧我的MacBook上说它是~11G,这很有道理……有人能帮我理解吗?