我在python中有一个包含数百个经过训练的r模型的大文章:这些是使用库rpy2构建的统计模型。
我有一个类,每次调用其中一个方法时都会加载pickle文件(这个方法在循环中被多次调用)。 即使没有指向加载内容的引用,也不会释放加载pickle文件内容(大约100 MB)所需的内存。我正确打开并关闭输入文件。我也尝试在每次迭代时重新加载pickle模块(甚至是rpy)。没有什么变化。似乎加载内容的事实永久地锁定了一些内存。
答案 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垃圾收集文档的链接。我希望这有助于马可!