14

我有 50 个泡菜文件,每个文件 0.5 GB。每个 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我的内存在打印之前溢出。我如何编写代码来保证每次迭代期间只加载一个泡菜?

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

相关:Python 垃圾回收

4

1 回答 1

9

您可以通过x = Nonefor fp in l:.

这样做的原因是因为它将取消引用 variable x,从而允许 python 垃圾收集器loadPickle()在第二次调用之前释放一些虚拟内存。

于 2013-04-29T22:12:54.377 回答