我有一个Python实用程序,它遍历tar.xz
文件并处理每个单独的文件。这是一个15MB的压缩文件,有740MB的未压缩数据。在
在内存非常有限的特定服务器上,程序会因为内存不足而崩溃。我使用objgraph查看创建了哪些对象。结果是,TarInfo
实例没有被释放。主回路与此类似:
with tarfile.open(...) as tar:
while True:
next = tar.next()
stream = tar.extractfile(next)
process_stream()
iter+=1
if not iter%1000:
objgraph.show_growth(limit=10)
输出非常一致:
^{pr2}$这一直持续到30000个文件都被处理完。在
为了确保,我已经注释掉了创建流并处理它的行。内存使用量保持不变-TarInfo实例被泄露。在
我使用的是python3.4.1,这种行为在Ubuntu、osx和Windows上是一致的。在
看起来这实际上是设计的。} ,它从存档中提取的
TarFile
对象维护它包含在members
属性中的所有TarInfo
对象的列表。每次调用^{TarInfo
对象都会添加到列表中:当您提取更多项时,} 和^{} 方法,但这对您的用例来说只是一个麻烦。似乎最好的解决方法是在迭代时继续清除
^{pr2}$members
列表将继续增长。这样就可以使用^{members
属性(如建议的here):相关问题 更多 >
编程相关推荐