释放python中所有使用的内存

时间:2019-01-20 07:56:31

标签: python linux ubuntu memory

设置:

我正在运行python代码,其中:

  1. 我打开一个文件。
  2. 对于文件中的每一行,我创建一个对象
  3. 对该对象进行一些操作

请注意,一旦我完成了操作部分,就不再需要该对象。每条新线都是独立的。

根据请求的相关代码:

我已经注释了我代码的所有部分,并在下面的代码下面留下了

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没有向系统释放内存。创建子进程是一个主意,但不是我想要的。

问题:

  1. 有什么办法可以将程序当前占用的所有内存释放给OS?这意味着删除所有变量(循环变量,全局变量等)。类似于按CTRL + C终止程序时,它将所有内存返回给操作系统。
  2. 一种专门取消分配对象的方法(如果我没有正确执行的话)。

如果gc.collect()失败,以前的问题无法回答,以及如何完全放弃分配的内存。

1 个答案:

答案 0 :(得分:0)

一旦引用计数降至零,就可以对Python中的对象进行垃圾回收。

查看您的代码,每个变量在每次迭代中都会重新分配。因此,他们的引用计数应该为零。

如果那没有发生,那么我可以看到三种主要可能性;

  1. 您无意间保留了对该对象的引用。
  2. 垃圾收集已禁用(gc.disable())或已冻结(gc.freeze()在Python 3.7中)。
  3. 这些对象由用C编写的Python扩展程序构成,该扩展程序管理自己的内存。

请注意,(1)或(2)不必在您的代码中发生。它也可能发生在您使用的模块中。

在您的情况下(2)应该不是问题,因为您强制进行垃圾收集。

对于(1)的示例,请考虑如果BooleanFunctionmemoized会发生什么。然后,将保留对每个对象的引用(您将看不到且无法删除)。

所有内存还给操作系统的唯一方法是终止程序。

编辑1:

尝试在启用垃圾收集调试标志(gc.DEBUG_LEAK)的情况下运行程序。在每个循环结束时运行gc.get_count()。也许还有gc.garbage()

要更好地了解内存分配发生在哪里以及到底发生了什么,可以在Python debugger下运行脚本。逐步浏览程序,同时在另一个终端中使用ps监视Python进程的常驻集大小。