8

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

有什么建议么?

谢谢

4

2 回答 2

15

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

$ 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 时间的额外需求最终可能会使其变慢——以及您感兴趣的特定 zipfile , 因为每个大的 zipfile 会有非常不同的组合和很可能的性能)。但这对我来说意味着没有太多空间可以比旧的更快地构建 Python 扩展zipfile——因为使用它的 Python 击败了纯 C、系统包含的解压缩!-)

于 2009-11-19T03:32:10.573 回答
5

要在不将它们加载到内存的情况下处理大文件,请使用 Python 2.6 版本中新的基于流的方法zipfile,例如ZipFile.open. 不要使用extractextractall除非您对 ZIP 中的文件名进行了严格的清理。

(您过去必须将read所有字节放入内存,或者像zipstream一样破解它;现在已经过时了。)

于 2009-11-19T13:47:46.357 回答