python - 创建熊猫数据帧时如何预分配内存
问题描述
在执行我的工作期间,我想在执行的每个步骤中构建一个带有内部状态的 pandas DataFrame。我想这样做是因为我希望以后能够使用 DataFrame 进行一些分析。所以,这就是上下文:我从一个空的 DataFrame 开始,在作业完成所有数据的生成后,最终的 DataFrame 大小为 7GB(最多)。
这些是我到目前为止尝试过的方法:
- 我可以维护一个列表列表,我的工作不断将新行附加到该列表中。最后我运行类似:
df = pd.DataFrame(rows, columns=list("abc"))
. 这是最快的方法,但是在内存使用方面非常浪费。 - 我不再使用列表列表,而是继续调用
df = df.append([{"a": 1.0, "b": 1.0, "c": "hello"}])
. 这开始没问题,但是随着 DataFrame 的增长,大量的内存复制开始发生,并且变得非常慢。
因此,它们都不是理想的。我可以在我的工作运行之前估计 DataFrame 的最终大小(老实说,我认为我通常可以精确匹配大小),所以我想告诉 pandas 提前分配整个内存(或者至少是足够大的块持续一段时间)然后,我想要一个类似的方法df.append
,将新行添加到预分配内存的末尾。理想情况下,如果需要,它会足够聪明地调整内存大小。
我可能严重遗漏了一些东西,但我真诚地无法在我所看到的任何地方找到一种方法来做到这一点。
解决方案
使用方法 1,但每次到达(例如)10000 行时,将列表列表转换为 DataFrame,将数据框附加到数据框列表,并清除列表列表(通过将其设置为 [])。最后,将您的 df 块列表和pd.concat
它们放在一起。
推荐阅读
- python - 是否可以在此代码逻辑上使用应用函数或矢量化?
- python - 无法使用 Dataflow + Beam + Python 创建模板
- c++ - shared_ptr 的动态绑定
- c# - 正则表达式匹配点分隔列表,最后没有点并允许最后有星号
- android - Android Nested RecyclerView 改变滚动角度
- jquery - jquery如何获取img src属性?
- java - 难以理解的课程
- laravel - Laravel 5.4 邮件降价 2 按钮内联
- php - 如何配置 XAMPP 以远程连接到 MySQL
- c# - 如何在单击并输入他们的errorProvider msg时检查所有文本框是否为空?