【发布时间】:2016-03-16 09:03:26
【问题描述】:
我有一个很大的 pickle 文件,其中包含数百个用 python 训练的 r 模型:这些是使用库 rpy2 构建的统计模型。
我有一个类,每次调用其中一个方法时都会加载pickle文件(此方法在循环中被调用多次)。 即使没有指向加载内容的引用,加载 pickle 文件内容所需的内存(大约 100 MB)也不会被释放。我正确打开和关闭输入文件。我还尝试在每次迭代时重新加载 pickle 模块(甚至 rpy)。没有什么变化。似乎只是加载内容的事实会永久锁定一些内存。
【问题讨论】:
-
我已经读过了。我的情况不同。在这种情况下,会有一个指向加载内容的引用。我做了类似的事情:
with open(trained_models_file, 'r') as file_: pickle.load(file_)当方法调用完成时应该释放内存 -
我不认为 GC 不能保证在任何特定点被调用,即使资源是空闲的。
-
当然不能保证。但它应该在内存泄漏和连续的程序终止发生之前被明确地调用。无论如何,我对代码进行了内存分析,发现调用了 GC,导致程序使用的其他内存的一部分被释放。但不是链接到pickle加载此文件的内存。
-
如果你编写一个脚本,只在无限循环中加载泡菜,每一步都休眠一段时间,你是否观察到泄漏?