7Z 最大化压缩配置

有一些老家伙们我可能未来好长一段时间都不会再使用了,但是它们真的很大,我就想着使用一种极限压缩方式将它们压成最小以方便存储

注意事项

版权与声明

本文部分技术核心取自以下文章,感谢这些文章的作者

  1. Reddit 上的提问 What is the best configuration to 7zip for maximum compression?

如果可能,请尽量阅读上方的原文章来学习

下文注释

下文会有一些代码块,左上角写着#的为需要超级用户身份执行的权限;左上角写着$的只需要普通用户既可执行

以下代码只使用#$来表示权限等级,不再明文写sudo

安全问题

无损压缩越是极限的压缩,冗余也就越少,也就是说,一旦压缩文件出现问题,恢复起来难度极其之大,这里使用的极限压缩方式,如果压缩文件出现哪怕一个字节的差错,都可能导致整个压缩文件完全不可用

所以建议您

  1. 为保证压缩成功,请在压缩完成后先测试一遍压缩文件再将原文件删除,以免您的文件不可恢复
  2. 为避免一个地方的存储(例如磁盘、网盘)出现错误,例如传输文件传错了一个字节,请在多个位置备份您的重要数据

效率和资源使用问题

这里使用的压缩方式压缩率是真的高,同时效率也是真的低,占用也是真的高

Reddit 原文中有写到压缩可能甚至会使用 21GB 的内存

建议不要在提供服务的主机上使用,除非你有大量的计算资源可以浪费

一、配置介绍

  • 压缩算法(method):使用 LZMA2 —— 这是 7z 支持的压缩算法中压缩率最高的压缩算法
  • 9 Ultra —— 这是 7z 命令的压缩等级,从 0-9,其中 0 是不压缩,1 是最高效率,9 是最高压缩
  • 字典(dictionary)大小:使用 1536Mib —— 字典大小决定了压缩过程中记忆的数据量,方便更高压缩率的压缩。字典越大,压缩率也越大,消耗的计算资源也越多
  • 字词(word)大小:使用 273 —— 字词大小是 LZMA 算法的一个参数,影响字节匹配的粒度。更大的字词大小的压缩率也更大,消耗的计算资源也更多
  • 块(block)大小:使用 solid(单个块)—— 让压缩不进行分块处理。这样可以最大化压缩率,特别是重复数据多的情况下。因为只使用一个块,所以解压缩时需要加载整个块的数据,会降低解压效率并增加内存需求,且只能同时使用单线程操作。

二、执行命令

按照上面的配置,执行命令应该如下

$ bash
1
7z a <compressed-file>.7z -m0=lzma2 -mx=9 -md=1536m -mfb=273 -ms=on <file1> [file2] [file3]...

其中

  • <compressed-file>.7z 是压缩后的文件,请替换成您的输出文件名
  • -m0=lzma2 是指定压缩算法为 LZMA2,这是默认值,所以可以省略
  • -mx=9 是上面所说的“9 - Ultra”
  • -md=1536m 是上面所说的字典大小
  • -mfb=273 是上面所说的字词大小
  • -ms=on 是上面所说的单个块
  • <file1>[file2][file3]... 是需要压缩的文件,请替换成您想要压缩的文件和目录

解压的参数工具会自动读取,所以不需要手动指定