如何解决为什么删除 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 举报,一经查实,本站将立刻删除。