微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

释放 Pandas 数据帧使用的内存的最佳方法

如何解决释放 Pandas 数据帧使用的内存的最佳方法

对于一个工作项目,我正在尝试对两个数据帧进行逐行比较,这比直接比较内存中加载的两个数据帧使用更少的内存。

所以这个想法是加载一个数据帧,将其行散列到一个单独的变量中,然后删除原始数据帧。然后对第二个 df 执行相同操作并比较哈希值。

不确定垃圾收集器会及时释放内存,并且考虑到 Pandas 数据帧是可变的,我认为最好的方法是改变数据帧并使其成为空的 df。之后我也删除了它,只是为了确保。

所以它似乎有效......有点。我运行了内存分析器,是的,分配一个空的 df 释放了大量内存,但由于某种原因,原始 df 并没有使用所有内存。例如,在第 37 行中,从镶木地板文件加载 df 消耗 4.5 Gb 内存,但在第 42 行中,我在其位置分配了一个空 df,它释放了 1.8 Gb 和 2.8 Gb 仍然被某些东西占用。

我想,也许当我分配一个空的数据框时,它出于某种原因保留了其中一个维度,只是用 nans 填充它,但不,在分配空的 df 后,数据框的形状是 (0,0)。

即使我尝试在下一行中删除对数据帧的引用,它也不会释放额外的内存。当我使用第二个数据框时也会发生同样的情况。

    37   4640.4 MiB   4568.7 MiB           1       original_data = pd.read_parquet(original)
    38                                         
    39                                             # Hash rows of the dataframe
    40   4675.3 MiB     34.9 MiB           1       hash_original = pd.util.hash_pandas_object(original_data)
    41                                             # Explicitly mutate the dataframe to make sure the memory is freed
    42   2866.1 MiB  -1809.2 MiB           1       original_data = pd.DataFrame()
    43   2866.1 MiB      0.0 MiB           1       del original_data
    44                                         
    45                                             # Same for modified data but also remove the newly added columns to compare like for like
    46   5875.6 MiB   3009.5 MiB           1       modified_data = pd.read_parquet(modified)
    47   5736.4 MiB   -139.2 MiB           1       modified_data.drop(list(added_cols),axis=1,inplace=True)
    48   5771.3 MiB     34.9 MiB           1       hash_modified = pd.util.hash_pandas_object(modified_data)
    49   3962.2 MiB  -1809.1 MiB           1       modified_data = pd.DataFrame()
    50   3962.2 MiB      0.0 MiB           1       del modified_data
    51                                         
    52   3962.3 MiB      0.1 MiB           1       result = hash_original.compare(hash_modified)
    53                                         
    54   3962.3 MiB      0.0 MiB           1       if not result.shape[0]:
    55   3962.3 MiB      0.0 MiB           1           return True
    56                                             else:
    57                                                 return result.index

尽我所能释放所有内存对于手头的任务来说非常重要。所以我的问题是:是什么占用了所有这些内存以及如何确保它被正确释放?

编辑: 还尝试了诸如

之类的东西
import gc

del original_data
gc.collect()

并就地删除数据框的行/列:

original_data.drop([i for i in original_data.index],axis=0,inplace=True)
# and
original_data.drop([col for col in original_data.columns],inplace=True)

似乎都具有完全相同的效果

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。