处理大文件的最佳Python压缩模块是什么?
编辑:具体来说,是关于压缩和解压缩的速度。
有什么建议吗?
谢谢!
2 个回答
5
如果你想处理大文件,但又不想把它们全部加载到内存中,可以使用Python 2.6版本中基于流的方法,比如ZipFile.open
。不要使用extract
或extractall
,除非你已经对ZIP文件中的文件名进行了严格的清理。
以前你需要把所有字节都读入内存,或者像zipstream那样进行一些变通;现在这些方法已经过时了。
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
也就是说,这个文件有116MB,里面有23400个文件,我还记录了时间:
$ 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
更快的Python扩展,空间并不大——因为用Python的这个库解压的速度比系统自带的纯C解压工具还要快!