2009-11-18 87 views

回答

13

所以我做了一个随机ISH大压缩文件:

$ 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时间的额外要求可能最终导致速度变慢)特定的zip文件,因为每个大的zip文件会有非常不同的组合,很可能是性能)。但是这对我而言意味着没有太多的空间来构建Python扩展,比旧版本zipfile快得多 - 因为使用它的Python击败纯C,包含系统的解压缩!)

+1

感谢您的分析,这是最有帮助的。 – Duck 2009-11-19 05:12:46

+0

@Duck,不客气! – 2009-11-19 05:36:40

+1

也很高兴看到内存使用量测量。无论如何。 – 2009-11-19 09:56:15

4

For处理大文件而不加载到内存中,请在Python 2.6的zipfile版本中使用新的基于流的方法,如ZipFile.open不要使用extractextractall除非你有强烈的消毒ZIP中的文件名。

(你曾经有read所有字节到内存中,或在其周围砍像zipstream;这是现在已经过时)

相关问题