常用的压缩包格式有zip,rar,7z这三类。一开始在处理这些压缩包时,采用的思路是直接用python封装的第三方模块如zipfile、rarfile、py7zr这些直接处理原始压缩文件。
如果只是处理几百兆的小文件,是没有任何问题,但对于几十G的压缩包效率极其低下,尤其针对不解压提取压缩包内部的文件内容的场景,一个rar的压缩包处理时长可能花费数十个小时。
本文针对压缩包清洗,花费大量时间研究。深入分析清洗数据的坑点,以及优化思路。
在不解压清洗压缩包内部数据的场景下:
zip > rar > 7z
这个是基于压缩包的兼容性,压缩比,python模块封装程度,解析速度等因素,在大量实验场景下得出的结论。
分析python模块rarfile的底层源码,会发现这个模块底层实际是调用subprocess去执行unrar系统命令来操作压缩包内部的文件。
对于一个几十G的rar压缩包,内部的文件可能上百万个。逐一读取内部的文件进行解析,相当于要调用几百万次unrar命令,而且都是进程级的开销,效率太低了。
但是这并不能归结于rarfile,而是rar的压缩协议本身并不开源,rarfile只能是对系统unrar进行封装调用。而且unrar的命令行还存在bug,在代码兼容上浪费大量时间。
7z相对于zip和rar,出现的频率相对较少,在实际场景下调用py7zr还是存在很多兼容性的问题,比如zipfile和rarfile的调用接口是完全一致的,但是py7zr却有很大差异。这就导致代码适配异常艰难,投入产出也非常低。
最开始想在代码层面适配各种格式的压缩包,最后还是决定直接把其他的压缩包格式统一转换成zip。
这就涉及到必须要先统一解压再压缩的过程。
建议统一用7z命令行来解压rar、zip、7z文件,都是兼容的。
7z x archive.rar -o /tmp
zip也有多种压缩算法,但是针对于文本文件压缩比最高的是 lzma算法。
7z a -tzip -mm=lzma -mx=9 NEW_FILE.zip "FILE_DIR/*"
这样压缩出来的zip文件,会比用rar压缩出的体积更小。经测试不管是压缩比,还是兼容性方面都是非常不错。
代码就不放出来了,只是给出一些思路。
Post Views: 2
赞赏微信赞赏
支付宝赞赏