我经常需要收集日志文件并将其上传到中央服务器(由另一家公司拥有)。中央服务器对文件大小有限制,因此我尝试创建尽可能小的文件,但仍然采用 zip 格式。
当我只需要较小的文件大小时,将文本文件压缩为 zip 格式时最佳设置是什么?
我做了显而易见的事情并选择了超级压缩,并且我注意到 LZMA 比 deflate 做得更好,但是有太多其他选项排列供我全部测试。
答案1
要创建 7-Zip 可以创建的最小标准 ZIP 文件,请尝试:
7z a -mm=Deflate -mfb=258 -mpass=15 -r foo.zip C:\Path\To\Files\*
否则,如果您不关心 ZIP 标准,请使用以下超级设置:
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1
哪个是:
-t7z 7z archive
-m0=lzma
lzma method
-mx=9 level of compression = 9 (Ultra)
-mfb=64
number of fast bytes for LZMA = 64
-md=32m
dictionary size = 32 megabytes
-ms=on solid archive = on
答案2
经过多次实验、深入研究详细的 7zip 文档以及阅读有关高级 LZMA2 参数的一些 7z 源代码后,下面提供了一种更好的方法。它减少了一些 1GB 的实际测试文件比之前接受的解决方案好 2 至 4 倍发布在这里或者甚至在 7z 手册页中。
7z a -t7z -mx=9 -mfb=273 -ms -md=31 -myx=9 -mtm=- -mmt -mmtf -md=1536m -mmf=bt3 -mmc=10000 -mpb=0 -mlc=0 archive.7z inputfileordir
这里假设使用 LZMA2 压缩,但你也许可以通过传递高级 LZMA2 选项(如-m0=LZMA2:27
、 或-m0=LZMA2:d25
)或参数数组(如
-m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1
我测试的 7z 版本似乎不支持这些参数,但您可能想进一步探索或修补 7z 代码以正确解析它们。或者它应该可以工作,只是在测试的版本中出现了问题。
答案3
如果你可以使用 .7z 格式而不仅仅是 .zip,我建议你直接使用聚丙烯酰胺凝胶电泳使用以下选项并保留压缩级别的其他设置:
- 存档格式:7z
- 压缩方法:聚丙烯酰胺凝胶电泳
- 压缩级别:极端主义者
我经常使用这些选项压缩服务器/文本日志(60MB+),它们通常1-2%原始大小。
答案4
我对 Ubuntu 服务器 14.04.03 中的 db.fdb 1,2 GB (1236598784 B) 与虚拟机上的 p7zip [64] 9.20 进行了比较:
1. 7z a -mx=9 1.7z db.fdb
2. 7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on 2.7z db.fdb
3. 7z a -t7z -m0=lzma -mx=9 -mfb=258 -md=32m -ms=on 3.7z db.fdb
4. 7z a -t7z -m0=lzma -mx=9 -mfb=258 -md=32m -ms=on -pass=15 4.7z db.fdb
5. 7z a -mx=9 -mmt=on 5.7z db.fdb
6. 7z a -t7z -m0=lzma -mx=9 -mfb=258 -md=32m -ms=on -mmt=on 6.7z db.fdb
并得到以下结果:
1.7z 96 MB (100108731 B) with 6' 25"
2.7z 95 MB ( 99520375 B) with 5' 18"
3.7z 93 MB ( 97512311 B) with 9' 19"
4.7z 93 MB ( 97512345 B) with 9' 40"
5.7z 96 MB (100108731 B) with 5' 26"
6.7z 93 MB ( 97512311 B) with 9' 09"
我认为第二种方法很好 = (几乎) 压缩效果最好,压缩时间也最短。但第一种方法最容易记住,文件较小,不需要最大压缩。在方法 2 和方法 3 之间,我们不会得到更小的 7z 文件,但压缩时间几乎增加了 20%。每个人都可以自行决定。