7z 中的组合压缩方法实际上有什么作用?

Sör*_*lau 11 compression command-line 7-zip

7z 命令行工具允许您指定多种压缩方法,例如:

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml
Run Code Online (Sandbox Code Playgroud)

所有方法都以某种方式使用,或者至少在元数据中指定:

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0
Run Code Online (Sandbox Code Playgroud)

它似乎没有通过所有三种方法运行文件,选择最好的。相反,它显然总是选择第一个,因为更改方法的顺序会显着影响文件大小。

即使我添加了多个文件,例如一个 XML 文件(PPMd 产生最佳压缩)和一个二进制文件(LZMA2 可以),它仍会列出这两个文件的所有方法,并且似乎不会针对每个文件动态切换。

事实上,文档特别说明“您可以使用任意数量的方法。”,但并没有说明为什么

我想要实现的是每个文件“尝试多种方法,选择最好的”存档。我当然可以通过一些脚本手动实现这一点,但据推测,链接压缩方法应该完全做到这一点?

Dan*_*l B 5

通常,压缩数据不能被有效地(进一步)压缩。应用第一种压缩方法后,文件大小无法显着减小。

-mN=X主要用于指定过滤器(从Windows帮助文件中获取):

支持的过滤器:

Delta Delta 过滤器(“可以以字节为单位设置增量偏移。例如,要压缩 16 位立体声 WAV 文件,您可以设置“0=Delta:4”。默认增量偏移为 1。”)

x86 可执行文件的BCJ转换器

用于 x86 可执行文件(版本 2)的BCJ2转换器(“BCJ2 是用于 32 位 x86 可执行文件(版本 2)的分支转换器。它转换一些分支指令以增加进一步压缩。”)

用于 ARM(小端)可执行文件的ARM转换器

用于 ARM Thumb(小端)可执行文件的ARMT转换器

IA-64 可执行文件的IA64转换器

用于 PowerPC(大端)可执行文件的PPC转换器

用于 SPARC 可执行文件的SPARC转换器

同样来自帮助文件,一个利用 BCJ2 过滤器的多个输出流的高级示例:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3
Run Code Online (Sandbox Code Playgroud)

使用 BCJ2 转换器将 *.exe 和 *.dll 文件添加到存档 archive.7z,LZMA 带有 8 MB 字典用于主输出流 (s0),LZMA 带有 512 KB 字典用于 BCJ2 的 s1 和 s2 输出流。