在 python 中使用 pickle 时发生内存泄漏

Memory leak when using pickle in python

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

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

如果您遵循此建议,请暂时这样做,因为我不是 100% 确定此解决方案,但我想尽我所能帮助您。

在Python中,垃圾收集不再使用引用计数,即当Python检测到有多少对象在引用一个对象时,然后当对象不再引用它时将其从内存中删除。

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

对于您的程序,即使您不再指向某些对象 Python 也可能还没有从内存中释放它,因此您可以使用以下方法手动执行此操作:

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

如果您想阅读更多内容,here 是 link 到 Python 垃圾收集文档。我希望这对马可有帮助!

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

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