我正在尝试运行一些迭代来填充一个大列表,直到我的内存使用率达到 60%,使用该列表,删除该列表,然后再次运行它。像这样的东西:
while True:
ls = []
usage = psutil.virtual_memory().percent
print(usage)
if usage < 60:
ls.append(bigThing)
else:
break
use_list(ls)
#seems redundant, but did this just in case
del ls
不管我做了什么,似乎内存使用量都收敛到了 60 左右。我第一次运行单元时,它可能看起来像这样:
30
35
40
50
62
在接下来的几次我运行该单元格时,它看起来像这样,在达到阈值之前,似乎有轻微的减少保持静态
58.7
58.7
58.7
58.7
58.7
60
然后它会直接进入60.1
,例如,从不迭代。
如果我运行任何有错误的代码,例如ls
连续删除两次,它似乎重置了内存使用量,它会回落到 30,我可以再次迭代。但是,如果我在一个try
块中执行此操作,它将保持不变。这让我觉得有一些移动上限会在出现错误时重置,但这就是我在这里的原因:我到底如何防止它像这样“上限”?
基于这个问题,python垃圾收集器不会立即自动释放未引用的内存。这可能取决于您的用例,但对我来说,使用import gc
并gc.collect()
在某些方面手动命令垃圾收集器清理数据,效果很好。所以我当前的程序看起来像这样:
while True:
ls = make_list_to_mem_thresh()
use_list(ls)
del ls
gc.collect()
很可能,当一个单元发生故障时,它会触发垃圾收集器。如果是这样,那就可以解释问题中描述的“封顶”现象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句