压缩包数据清洗最佳实践
文章探讨了处理大容量压缩包的效率问题,指出在不解压情况下清洗数据时,ZIP格式优于RAR和7Z。建议将所有压缩包统一转换为ZIP,并使用7z命令行工具进行解压和压缩以提高效率。 2025-2-28 09:18:27 Author: zgao.top(查看原文) 阅读量:13 收藏

常用的压缩包格式有zip,rar,7z这三类。一开始在处理这些压缩包时,采用的思路是直接用python封装的第三方模块如zipfile、rarfile、py7zr这些直接处理原始压缩文件。

如果只是处理几百兆的小文件,是没有任何问题,但对于几十G的压缩包效率极其低下,尤其针对不解压提取压缩包内部的文件内容的场景,一个rar的压缩包处理时长可能花费数十个小时。

本文针对压缩包清洗,花费大量时间研究。深入分析清洗数据的坑点,以及优化思路。

结论分析

不解压清洗压缩包内部数据的场景下:

zip > rar > 7z

这个是基于压缩包的兼容性,压缩比,python模块封装程度,解析速度等因素,在大量实验场景下得出的结论。

为什么不推荐使用rar和7z?

分析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

赞赏

微信赞赏支付宝赞赏


文章来源: https://zgao.top/%e5%8e%8b%e7%bc%a9%e5%8c%85%e6%95%b0%e6%8d%ae%e6%b8%85%e6%b4%97%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5/
如有侵权请联系:admin#unsafe.sh