【发布时间】:2013-04-23 17:26:21
【问题描述】:
我有 50 个 pickle 文件,每个文件大小为 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 模块进行显式垃圾收集,但我很难理解如何将这些方法应用于我的特定用例。这是因为我对引用的工作原理了解不足。
【问题讨论】:
-
尝试在
for fp in l:之后添加x = None -
嗨 Ionut Hulub,谢谢。成功了!
-
这里没有实际的内存泄漏。只是旧的
x值要等到新的值被赋值后才能释放,所以需要足够的内存才能同时在内存中存两个值。
标签: python memory-leaks python-3.x garbage-collection pickle