Python 3.x Jupyter笔记本电脑的内存使用量将达到顶峰';这是个错误
我试图运行一些迭代,填充一个大列表,直到我的内存使用率达到60%,使用该列表,删除该列表,然后再次运行它。大概是这样的:Python 3.x Jupyter笔记本电脑的内存使用量将达到顶峰';这是个错误,python-3.x,jupyter-notebook,Python 3.x,Jupyter Notebook,我试图运行一些迭代,填充一个大列表,直到我的内存使用率达到60%,使用该列表,删除该列表,然后再次运行它。大概是这样的: while True: ls = [] usage = psutil.virtual_memory().percent print(usage) if usage < 60: ls.append(bigThing) else: break use_list(ls) #seem
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
30
35
40
50
62
while True:
ls = make_list_to_mem_thresh()
use_list(ls)
del ls
gc.collect()
接下来的几次我运行单元格时,它看起来是这样的,似乎有一个轻微的减少,在达到阈值之前保持静止
58.7
58.7
58.7
58.7
58.7
60
例如,它将直接转到60.1
,而从不进行迭代
如果我运行任何有错误的代码,例如连续两次删除ls
,它似乎会重置内存使用,它会下降到30,我可以再次迭代。但是,如果我在try
块中执行此操作,它将保持不变。这让我觉得当出现错误时,会有一些移动封顶重置,但这就是我在这里的原因:我该如何防止它像这样“封顶”?基于此,python垃圾收集器不会立即自动释放未引用的内存。这可能取决于您的用例,但对我来说,在某些情况下使用import gc
和gc.collect()
手动命令垃圾收集器清理数据,效果很好。所以我现在的计划看起来有点像这样:
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
30
35
40
50
62
while True:
ls = make_list_to_mem_thresh()
use_list(ls)
del ls
gc.collect()
当一个单元发生故障时,很可能会触发垃圾收集器。如果是这样的话,这就可以解释问题中描述的“封顶”现象。(问题是为什么
del
会出现这种情况)问题的关键是在另一次迭代之前尝试删除ls,这样用法的值在下一次迭代中将更低,但正如问题中提到的,它保持不变(我觉得表面上)很高