首页 > 解决方案 > pandas DataFrame 切片内存行为

问题描述

当使用作为 pandas DataFrame 加载时占用约 10GB 内存的大型数据集时,我注意到用布尔值对其进行切片似乎占用了与制作副本一样多的内存,例如:

dfsub = df[df['date']<20201001]

据说它返回了原始 DataFrame 大约一半的视图,实际上导致内存使用量增加了 50% 到 ~15GB(top用于实时观察)。

如果我只用几行:

dfsub = df[df['date']==20201001]

内存占用回落到 10GB。

切片不应该只返回原始 DataFrame 的视图,它实际上不复制底层数据吗?我想我只是不明白 DataFrame 'views' 是如何工作的。我认为这仅仅意味着对同一底层数据存储的索引应该会产生最小的开销。否则,“视图”与“副本”的意义何在?

此外,我注意到即使选择了一个小切片,第一次调用也会暂时将内存使用量翻倍至 ~20GB,但随后又降至 ~10GB。后续调用不会产生这种短暂的内存峰值。

(python 3.4.3 上的熊猫 0.23.4)

标签: pythonpandasdataframememory

解决方案


如果我错了,有人纠正我,但这看起来正在发生,因为您将视图保存到内存中。在我的内存急剧增加并且我的程序会因为内存不足而崩溃之前,我也遇到过类似的问题。尝试在需要的地方使用程序中的视图,这对我有用,并且允许我的程序运行并且不会耗尽内存。例如:

dfsub = df[df['date']==20201001]
for i,row in dfsub.iterrows():
    print(row)

可以替换为:

for i,row in df[df['date']==20201001].iterrows():
    print(row)

这将使用切片作为视图,因为它不会将其保存到额外的内存位置。


推荐阅读