【问题标题】:pandas read_csv memory consumptionpandas read_csv 内存消耗
【发布时间】:2017-05-15 22:00:15
【问题描述】:

我正在阅读以 csv 格式存储的巨大 Pandas(版本 18.1,故意)数据帧(〜总计 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 可以节省内存。所以这是我的问题。读取大熊猫数据帧的最佳方式(性能、内存)是什么?

【问题讨论】:

  • 试试这个:df = pd.concat((x for x in pd.read_csv(fn, chunksize=50000))
  • 我试过了。不幸的是,这并没有改变任何东西。
  • 一年后,我使用的是 version0.22。似乎它仍然是一个未解决的问题......我在读取 ~7G csv 文件时遇到了类似的内存错误。奇怪的是,在我的 16G 内存的 MacBook 上,它运行良好。但是在我的 32G 内存的 Ubuntu17 上,它抛出了“内存错误”。我的 MacBook 上的最终数据框说它是 ~11G,这是有道理的......谁能帮我理解它?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 2010-10-12
      • 1970-01-01
      • 2015-03-28
      • 2021-06-13
      • 1970-01-01
      • 2011-10-03
      • 2012-11-24
      • 2013-10-08
      相关资源
      最近更新 更多