3

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

随着日志文件数量的增加(~74 000),我注意到系统在运行时有效地终止了这个备份进程。我注意到它消耗了大量的内存(在被操作系统杀死之前约为 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 $”)。

4

2 回答 2

4

我在源代码中做了一些挖掘,似乎 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/')。

于 2014-01-13T13:07:06.967 回答
0

两种解决方法:如果你的虚拟机没有swap 添加试试。我有 13GB 的文件要打包成一个大包,但它一直在失败。操作系统被杀死。添加 4GB 交换有帮助。

如果您使用的是 k8-pod 或 docker 容器,一种快速的解决方法可能是 - 在主机中添加交换,功能:sys-admin 或特权模式将使用主机交换。

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

于 2020-11-18T14:32:03.957 回答