Python 3.x Jupyter笔记本电脑的内存使用量将达到顶峰';这是个错误

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

我试图运行一些迭代,填充一个大列表,直到我的内存使用率达到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
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,这样
用法的值在下一次迭代中将更低,但正如问题中提到的,它保持不变(我觉得表面上)很高