当我在for循环中加载大型pickle文件时,如何防止内存泄漏?

时间:2013-04-29 21:58:16

标签: python memory-leaks python-3.x garbage-collection pickle

我有50个每个0.5 GB的pickle文件。 每个pickle文件都包含一个自定义类对象列表。 我可以使用单独加载文件 以下功能:

def loadPickle(fp):
    with open(fp, 'rb') as fh:
        listOfObj = pickle.load(fh)
    return listOfObj

但是,当我尝试迭代加载文件时 我得到了内存泄漏。

l = ['filepath1', 'filepath2', 'filepath3', 'filepath4']
for fp in l:
    x = loadPickle(fp)
    print( 'loaded {0}'.format(fp) )

我的内存在打印loaded filepath2之前溢出。 如何编写代码以保证在每次迭代期间只加载一个pickle?

关于SO的相关问题的答案建议使用weakref模块中定义的对象或使用gc模块的显式垃圾收集,但我很难理解如何将这些方法应用于我的特殊用例。这是因为我对引用工作原理的理解不够充分。

相关:Python garbage collection

1 个答案:

答案 0 :(得分:8)

您可以在x = None之后添加for fp in l:来解决此问题。

这样做的原因是因为它会解除变量x,允许python垃圾收集器在第二次调用loadPickle()之前释放一些虚拟内存。