关于压缩的各种探索
内容提要
作者测试多种压缩算法压缩博客包:7-Zip的LZMA2约4MiB,ZPAQ约3.5MiB,PAQ8PX仅3.1MiB但耗时一个半小时、占用30GiB内存,NNCP和cmix效果不佳。结论是日常仍用7-Zip,小文件追求极限可用ZPAQ。随后作者借助AI实现zstd、ZIP乃至RAR格式的自包含Quine压缩包,感叹AI能力强大,并担忧人类被AI淘汰后记录是否还有意义。
延伸解读
极限压缩的代价:时间与内存的权衡
文章实测显示,PAQ8PX虽能将博客包压到3.1MiB,但压缩耗时一个半小时且占用30GiB内存,解压同样耗时耗资源,基本无法日常使用。ZPAQ压缩到3.5MiB仅需一分钟,速度在可接受范围内。这提醒读者:追求极限压缩比时,必须同时考虑压缩和解压的时间与内存成本,否则算法再强也难以实用。
算法选择需匹配数据类型
NNCP使用Transformer模型,在RTX4090上耗时一个半小时,结果却只压到4.1MiB,不如LZMA2。作者推测原因是博客包内含图片,而NNCP专攻英文文本。这说明压缩算法的效果高度依赖数据类型,文本特化算法处理混合数据可能反而不如通用算法。读者在选择算法前,应先明确自己的数据构成。
Quine压缩包的兼容性隐患
作者借助AI实现了zstd、ZIP乃至RAR格式的自包含Quine压缩包。其中ZIP Quine因成员数据存在重叠,Python标准库zipfile会检查压缩数据是否越过后续成员局部头而拒绝解压,但7-Zip和libarchive能正常处理。这提示读者:此类非常规构造的压缩包可能存在工具兼容性问题,使用前需确认解压工具支持。
AI辅助编程的复杂性与可读性
作者感叹AI生成的Quine生成器代码越来越复杂,自己根本看不懂,但问题确实被神奇地解决了。这反映出一个现实:AI能快速产出可运行的复杂代码,但人类理解与维护的难度随之上升。读者在借助AI完成高难度任务时,应重视验证与文档,避免代码成为无法审查的黑箱。
Q&A
7-Zip 的 LZMA2 压缩博客包效果如何?和其他常见算法比呢?
作者用 7-Zip 的 LZMA2 把约 16MiB 的博客压缩包压到约 4MiB。Zip、zstd、BZip2 等常见算法即使开最高等级,压缩效果都不如 LZMA2,速度还更慢,因此日常压缩仍推荐 7-Zip。
PAQ8PX 压缩比那么高,为什么不适合日常使用?
PAQ8PX 能把博客包压到 3.1MiB,是测试中压缩比最高的,但代价极大:压缩花了一个半小时、占用 30GiB 内存,解压同样要消耗这么多时间和资源,基本无法正常使用。
ZPAQ 和 PAQ8PX 相比,哪个更适合压缩小文件?
如果想把不算太大的文件压到尽可能小,ZPAQ 更合适。它一分钟左右能把博客包压到 3.5MiB,比 7-Zip 少约 10%,速度在可接受范围内;PAQ8PX 虽然更小(3.1MiB),但耗时和内存占用完全不适合日常使用。
NNCP 和 cmix 这两个基于机器学习的压缩算法实测表现怎么样?
NNCP 用 RTX4090 压了一个半小时,结果只有 4.1MiB,压缩比还不如 LZMA2,可能因为它专攻英文文本而博客里有图片。cmix 在测试中压到后面总是崩溃,从崩溃位置看压缩一半的结果仍比 PAQ8PX 大,表现尴尬。
zstd Quine 相比 7z Quine 在实现上有什么难点?
结构上 zstd 更简单,因为它支持“可跳过帧”,构建自由度更高;难点在于 zstd 默认用非线性的 XXH64 校验,不像 CRC32 那样容易用公式算出。不过 XXH64 只校验低 32 位且计算快,可以通过爆破或构造方式解决。
AI 生成的 ZIP Quine 有什么兼容性问题?
这种 ZIP Quine 通过让成员数据存在重叠部分来绕过窗口大小限制,导致 Python 标准库 zipfile 因检查成员压缩数据是否越过后续成员局部头而无法解压,但 7-Zip 和 libarchive 都能正常解压,兼容性问题不算严重。