设置:
我正在运行python代码,其中:
请注意,一旦我完成了操作部分,就不再需要该对象。每条新线都是独立的。
根据请求的相关代码:
我已经注释了我代码的所有部分,并在下面的代码下面留下了
:import gc
for l in range(num_lines):
inp = f.readline()[:-1]
collector = [int(i) for i in inp]
M = BooleanFunction(collector)
deg = M.algebraic_degree()
del M
gc.collect()
问题:
对象一旦创建,就会消耗一些内存。执行完操作后,我将无法释放它。因此,在遍历文件时,我的内存不断积累新对象,并且到文件中大约793行时,我的16 GB RAM已完全耗尽。
我尝试过的事情:
使用垃圾收集器:
import gc
del Object
gc.collect()
但是,垃圾收集器不会释放RAM(或者)python没有向系统释放内存。创建子进程是一个主意,但不是我想要的。
问题:
如果gc.collect()失败,以前的问题无法回答,以及如何完全放弃分配的内存。
答案 0 :(得分:0)
一旦引用计数降至零,就可以对Python中的对象进行垃圾回收。
查看您的代码,每个变量在每次迭代中都会重新分配。因此,他们的引用计数应该为零。
如果那没有发生,那么我可以看到三种主要可能性;
gc.disable()
)或已冻结(gc.freeze()
在Python 3.7中)。请注意,(1)或(2)不必在您的代码中发生。它也可能发生在您使用的模块中。
在您的情况下(2)应该不是问题,因为您强制进行垃圾收集。
对于(1)的示例,请考虑如果BooleanFunction
为memoized会发生什么。然后,将保留对每个对象的引用(您将看不到且无法删除)。
将所有内存还给操作系统的唯一方法是终止程序。
编辑1:
尝试在启用垃圾收集调试标志(gc.DEBUG_LEAK
)的情况下运行程序。在每个循环结束时运行gc.get_count()
。也许还有gc.garbage()
。
要更好地了解内存分配发生在哪里以及到底发生了什么,可以在Python debugger下运行脚本。逐步浏览程序,同时在另一个终端中使用ps
监视Python进程的常驻集大小。