【问题标题】:pandas DataFrame slicing memory behaviorpandas DataFrame 切片内存行为
【发布时间】:2021-11-22 13:00:43
【问题描述】:

在处理作为 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)

【问题讨论】:

    标签: python pandas dataframe memory


    【解决方案1】:

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

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

    可以替换为:

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

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

    【讨论】:

    • 我的测试无论如何都不使用dfsub(或者我同意后续使用可能会导致数据副本)。在您的示例中,您是否建议仅将切片/视图分配给变量 dfsub 会导致数据被复制,或者您是否建议后续迭代导致它?
    • 我相信它被分配给一个变量,这就是我过去的问题。
    • python 是基于 ala java 的参考,所以我怀疑是这种情况。实际上,我最初的电话已经到位df[df['date']==20201001].to_csv(...),它发生了内存爆炸。我删除了to_csv,仅在to_csv 进行任何幕后复制的情况下查看切片效果。
    • 哦,好吧,那是有道理的,那么您是如何使用它的,当您删除 to_csv 时,内存是否仍然爆炸?
    • 是的,在第一次切片调用时特别奇怪,它会暂时使内存使用量翻倍。后续的切片调用只会大致增加切片中的数据量。
    猜你喜欢
    • 2012-08-06
    • 2021-04-22
    • 2018-03-08
    • 2013-09-01
    • 2017-03-28
    • 2017-08-22
    • 2017-12-11
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多