首页 > 解决方案 > 创建熊猫数据帧时如何预分配内存

问题描述

在执行我的工作期间,我想在执行的每个步骤中构建一个带有内部状态的 pandas DataFrame。我想这样做是因为我希望以后能够使用 DataFrame 进行一些分析。所以,这就是上下文:我从一个空的 DataFrame 开始,在作业完成所有数据的生成后,最终的 DataFrame 大小为 7GB(最多)。

这些是我到目前为止尝试过的方法:

  1. 我可以维护一个列表列表,我的工作不断将新行附加到该列表中。最后我运行类似:df = pd.DataFrame(rows, columns=list("abc")). 这是最快的方法,但是在内存使用方面非常浪费。
  2. 我不再使用列表列表,而是继续调用df = df.append([{"a": 1.0, "b": 1.0, "c": "hello"}]). 这开始没问题,但是随着 DataFrame 的增长,大量的内存复制开始发生,并且变得非常慢。

因此,它们都不是理想的。我可以在我的工作运行之前估计 DataFrame 的最终大小(老实说,我认为我通常可以精确匹配大小),所以我想告诉 pandas 提前分配整个内存(或者至少是足够大的块持续一段时间)然后,我想要一个类似的方法df.append,将新行添加到预分配内存的末尾。理想情况下,如果需要,它会足够聪明地调整内存大小。

我可能严重遗漏了一些东西,但我真诚地无法在我所看到的任何地方找到一种方法来做到这一点。

标签: pythonpandasdataframe

解决方案


使用方法 1,但每次到达(例如)10000 行时,将列表列表转换为 DataFrame,将数据框附加到数据框列表,并清除列表列表(通过将其设置为 [])。最后,将您的 df 块列表和pd.concat它们放在一起。


推荐阅读