在python中使用pickle时内存泄漏

时间:2015-12-10 16:20:40

标签: python pickle rpy2

我在python中有一个包含数百个经过训练的r模型的大文章:这些是使用库rpy2构建的统计模型。

我有一个类,每次调用其中一个方法时都会加载pickle文件(这个方法在循环中被多次调用)。 即使没有指向加载内容的引用,也不会释放加载pickle文件内容(大约100 MB)所需的内存。我正确打开并关闭输入文件。我也尝试在每次迭代时重新加载pickle模块(甚至是rpy)。没有什么变化。似乎加载内容的事实永久地锁定了一些内存。

2 个答案:

答案 0 :(得分:4)

我可以重现这个问题,现在这是rpy2问题跟踪器中的一个未解决的问题:https://bitbucket.org/rpy2/rpy2/issues/321/memory-leak-when-unpickling-r-objects

编辑:问题已解决,修复程序已包含在rpy2-2.7.5中(刚刚发布)。

答案 1 :(得分:0)

如果你遵循这个建议,请暂时,因为我不是100%肯定这个解决方案,但我想尽力帮助你。

在Python中,垃圾收集不再使用引用计数,这是当Python检测到引用对象的对象数量时,当对象不再引用它时将其从内存中删除。

相反,Python使用计划垃圾收集。这意味着Python设置垃圾收集的时间而不是立即执行。 Python切换到这个系统,因为计算引用会减慢程序的速度(特别是当它不需要时)

对于你的程序,即使你不再指向某些对象,Python可能还没有将它从内存中释放出来,所以你可以手动使用:

gc.enable() # enable manual garbage collection
gc.collect() # check for garbage collection

如果您想了解更多信息,here是Python垃圾收集文档的链接。我希望这有助于马可!