释放python中所有使用的内存 - python

设定:

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

问题:

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

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

参考方案

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

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

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

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

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

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

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

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

编辑1:

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

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

如何从python向终端(linux)发送多个命令? - python

我想向Linux终端发送命令以运行python脚本。我有一个要运行的python文件列表,当我们顺序阅读该列表时,我想一个接一个地运行它们。第一个文件完成后,应发送第二个文件以运行,依此类推。 参考方案 您可以使用以下命令顺序运行脚本:python script1.py && python script2.py && pyth…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python-crontab模块 - python

我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…