编辑:特别是压缩和提取速度。
任何建议?
由于
答案 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
。 不要使用extract
或extractall
,除非您强烈清理了ZIP中的文件名。
(你曾经将read
所有字节都记录到内存中,或像zipstream那样破解它;现在已经过时了。)