Pythons本机tarfile lib的高内存使用率

时间:2014-01-10 09:03:16

标签: python tarfile

我在内存受限的环境中工作,并使用带有tarfile库(http://docs.python.org/2/library/tarfile.html)的Python脚本来持续备份日志文件。

随着日志文件数量的增加(约74 000),我注意到系统在现在运行时有效地杀死了这个备份过程。我注意到它消耗了大量的内存(在被OS杀死之前约为192mb)。

我可以制作一个日志文件的gzip tar存档($ tar -czf)而不会出现问题或内存使用率很高。

代码:

import tarfile
t = tarfile.open('asdf.tar.gz', 'w:gz')
t.add('asdf')
t.close()

目录“asdf”由74407个文件组成,文件名长度为73。 当你有大量的文件时,不建议使用Python的tarfile吗?

我正在运行Ubuntu 12.04.3 LTS和Python 2.7.3(tarfile版本似乎是“$ Revision:85213 $”)。

2 个答案:

答案 0 :(得分:2)

我在源代码中进行了一些挖掘,似乎tarfile将所有文件存储在TarInfo对象列表(http://docs.python.org/2/library/tarfile.html#tarfile.TarFile.getmembers)中,导致内存占用越来越多,文件名很多。

这些TarInfo对象的缓存似乎已经在2008年http://bugs.python.org/issue2058的提交中得到了显着优化,但从我可以看到它只与Python 3的py3k分支合并。

可以一次又一次地重置成员列表,如http://blogs.it.ox.ac.uk/inapickle/2011/06/20/high-memory-usage-when-using-pythons-tarfile-module/,但是我不确定那个内部tarfile功能是什么,所以我选择使用系统级调用(> os.system) ('tar -czf asdf.tar asdf /').

答案 1 :(得分:0)

两种解决方法:如果您的VM没有交换,请添加并尝试。我有13GB的文件要塞进一个大包中,但一直失败。 OS被杀。添加4GB交换有帮助。

如果您使用的是k8-pod或docker容器,一种快速的解决方法是-在host中添加swap,capability:sys-admin或特权模式将使用host swap。

如果您需要带有流的tarfile以避免内存-结帐:https://gist.github.com/leth/6adb9d30f2fdcb8802532a87dfbeff77