什么是处理大文件的最佳Python Zip模块?

时间:2009-11-18 22:57:28

标签: python performance compression zip extraction

编辑:特别是压缩和提取速度。

任何建议?

由于

2 个答案:

答案 0 :(得分:14)

所以我做了一个随机的大型zipfile:

$ ls -l *zip
-rw-r--r--  1 aleax  5000  115749854 Nov 18 19:16 large.zip
$ unzip -l large.zip | wc
   23396   93633 2254735

即116 MB,其中包含23.4K文件,以及定时内容:

$ time unzip -d /tmp large.zip >/dev/null

real    0m14.702s
user    0m2.586s
sys         0m5.408s

这是系统提供的命令行解压缩二进制文件 - 毫无疑问,它与纯C可执行文件一样经过精细调整和优化。然后(在清理/ tmp之后; - )......:

$ time py26 -c'from zipfile import ZipFile; z=ZipFile("large.zip"); z.extractall("/tmp")'

real    0m13.274s
user    0m5.059s
sys         0m5.166s

...这是带有标准库的Python - 对CPU时间要求更高,但实际速度提高了10%,即经过的时间。

欢迎您重复这样的测量(在您的特定平台上 - 如果它是CPU差的,例如慢速ARM芯片,那么Python对CPU时间的额外需求可能最终使其变慢 - 并且您的具体感兴趣的zipfiles,因为每个大型zipfile将有一个非常不同的混合,很可能性能)。但是,这对我来说,没有那么多空间来构建Python扩展,比旧的zipfile快得多 - 因为Python使用它比纯C,系统包含的解压缩! - )< / p>

答案 1 :(得分:5)

要处理大文件而不将其加载到内存中,请使用Python 2.6版zipfile中新的基于流的方法,例如ZipFile.open不要使用extractextractall,除非您强烈清理了ZIP中的文件名。

(你曾经将read所有字节都记录到内存中,或像zipstream那样破解它;现在已经过时了。)