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

问题描述 投票:3回答:3

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

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

python pickle rpy2
3个回答
4
投票

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

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


0
投票

如果您遵循此建议,请暂定,因为我不确定该解决方案的100%,但是我想尽力帮助您。

在Python中,垃圾回收不再使用引用计数,这是Python检测到有多少个对象正在引用一个对象,然后在对象不再引用该对象时将其从内存中删除。

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

就您的程序而言,即使您不再指向某些对象,Python可能仍无法将其从内存中释放出来,因此您可以使用:

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

如果您想了解更多信息,here是指向Python垃圾收集文档的链接。我希望这对Marco有所帮助!


0
投票

我在2020年遇到类似的问题

© www.soinside.com 2019 - 2024. All rights reserved.