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

为什么删除 DataFrame 的列或部分会增加内存使用量,以及如何确保对未使用的 DataFrame 切片进行垃圾回收

如何解决为什么删除 DataFrame 的列或部分会增加内存使用量,以及如何确保对未使用的 DataFrame 切片进行垃圾回收

在处理大型 DataFrame 时,您需要注意内存使用情况(例如,您可能希望分块下载大型数据,处理这些块,然后从内存中删除所有不需要的部分)。

我找不到关于在 pandas 中处理垃圾收集的最佳程序的任何资源,但我尝试了以下方法并得到了令人惊讶的结果:

import os,psutil,gc
import pandas as pd

def get_process_mem_usage():
    process = psutil.Process(os.getpid())
    print("{:.3f} GB".format(process.memory_info().RSS / 1e9))

get_process_mem_usage()
# Out: 0.146 GB
cdf = pd.DataFrame({i:np.random.rand(int(1e7)) for i in range(10)})
get_process_mem_usage()
# Out: 0.946 GB

具有以下 globals() 及其内存使用情况:

          Size
cdf   781.25MB
_iii    1.05KB
_i1     1.05KB
_oh    240.00B

当我尝试删除某些内容时,我得到:

del cdf[1]
gc.collect()
get_process_mem_usage()
# Out: 1.668 GB

具有较高的进程内存使用率,但以下globals()

          Size
cdf   703.13MB
_i1     1.05KB
Out    240.00B
_oh    240.00B

所以仍然分配了一些内存,但没有被 globals() 中的任何对象使用。

我在做类似的事情时也看到了奇怪的结果

cdf2 = cdf.iloc[:,:5]
del cdf

有时会创建一个名为 "_5" 的新全局变量,并且内存使用量比之前的 cdf 多(我不确定这个全局变量指的是什么,也许是某种包含 no - 来自 cdf 的引用列更长,但为什么更大?

另一种选择是通过以下之一“删除”列:

cdf = cdf.iloc[:,:5]
# or
cdf = cdf.drop(columns=[...])

其中的列不再被任何对象引用,因此它们被删除。但对我来说,这似乎并不是每次都会发生。我可以发誓我已经看到我的进程在此操作后占用了相同数量的内存,即使之后我调用 gc.collect() 也是如此。虽然当我尝试在笔记本中重新创建它时,它不会发生。

所以我想我的问题是:

  • 为什么会出现上述情况,删除会导致更多内存使用
  • 确保不再需要的列从内存中删除并正确垃圾清理的最佳方法是什么?

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