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

处理大型文件的最佳Python Zip模块是什么?,python,performance,compression,zip,extraction,Python,Performance,Compression,Zip,Extraction,编辑:特别是压缩和提取速度 有什么建议吗 谢谢所以我做了一个随机大小的拉链: $ ls -l *zip -rw-r--r-- 1 aleax 5000 115749854 Nov 18 19:16 large.zip $ unzip -l large.zip | wc 23396 93633 2254735 i、 例如,116MB,其中包含23.4K文件,并且计时: $ time unzip -d /tmp large.zip >/dev/null real 0m

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

有什么建议吗


谢谢

所以我做了一个随机大小的拉链:

$ ls -l *zip
-rw-r--r--  1 aleax  5000  115749854 Nov 18 19:16 large.zip
$ unzip -l large.zip | wc
   23396   93633 2254735
i、 例如,116MB,其中包含23.4K文件,并且计时:

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

real    0m14.702s
user    0m2.586s
sys         0m5.408s
这是系统提供的命令行解压二进制文件——毫无疑问,它可以像纯C可执行文件一样进行微调和优化。然后(在清理/tmp;-)…:

…这是Python及其标准库—对CPU时间的要求有点高,但实际速度要快10%以上,即运行时间


当然,欢迎您重复这样的测量(在您的特定平台上——如果是CPU不足的平台,例如速度较慢的ARM芯片,那么Python对CPU时间的额外需求可能最终会使其速度变慢——以及您感兴趣的特定zipfiles,因为每个大zipfile将有非常不同的组合,并且很可能具有不同的性能)。但这对我来说意味着,构建Python扩展的空间并没有旧的
zipfile
那么大,因为Python使用它要比纯C、系统包含的解压快得多

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


(您以前必须
将所有字节读入内存,或者对其进行类似的破解;现在已经过时了。)

您是否将zipfile的性能与直接在shell中使用zip/unzip的性能进行了比较?感谢您的分析,这非常有帮助。看到内存使用量测量结果也会很好+1不管怎样。显然,你的里程数可能会有所不同。。。我发现使用
zipfile.open()
动态打开压缩内容实际上比从文件系统打开相同数量的文件(即以前从.zip存档中提取的文件)要快一些。这可能是因为
zipfile.open()
使用了已经打开的.zip文件,并且不需要文件系统目录和文件打开操作的开销。免责声明:我必须处理许多压缩率很低的小文件。YMMV具有更大的文件,或者当存档中没有那么多文件时。我使用了Python 3.5.3。
$ time py26 -c'from zipfile import ZipFile; z=ZipFile("large.zip"); z.extractall("/tmp")'

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