python - 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)
解决方案
如果我错了,有人纠正我,但这看起来正在发生,因为您将视图保存到内存中。在我的内存急剧增加并且我的程序会因为内存不足而崩溃之前,我也遇到过类似的问题。尝试在需要的地方使用程序中的视图,这对我有用,并且允许我的程序运行并且不会耗尽内存。例如:
dfsub = df[df['date']==20201001]
for i,row in dfsub.iterrows():
print(row)
可以替换为:
for i,row in df[df['date']==20201001].iterrows():
print(row)
这将使用切片作为视图,因为它不会将其保存到额外的内存位置。
推荐阅读
- r - 基于多行值消除案例
- sql - SQL - 尝试按支出组查找客户,然后按年龄和性别对这些客户进行分组
- unity3d - GvrEventSystem 与 EventSystem
- matlab - 使用循环将累积和添加到 MATLAB 中的表中
- c# - 以通用方式从 json 创建规则类
- tsql - 仅将一个字符串转换为 tinyint 时出现明显的算术错误
- python - * 不支持的操作数类型:'function' 和 'function' with lambda function
- python - 如何在 Django 单元测试中使用 rabbitMQ 作为 celery 的代理
- sql - 以下查询的 YTD
- apache-kafka - 使用 Kafka-Connect 通过 SSL 连接到 MSK 时出现问题