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

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

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

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

$ 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

确实如此不是似乎通过这三种方法运行文件,并选择最佳方法。相反,它显然总是选择第一种,因为更改方法的顺序会显著影响文件大小。

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

事实上,文档中明确指出“您可以使用任意数量的方法”,但没有说因此

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

答案1

通常,压缩数据无法进一步有效压缩。应用第一种压缩方法后,文件大小无法明显减小。

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

支持的过滤器:

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

加拿大广播公司x86 可执行文件的转换器

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

手臂ARM(小端)可执行文件的转换器

动脉造影ARM Thumb(小端)可执行文件的转换器

IA64IA-64 可执行文件的转换器

PPCPowerPC(大端)可执行文件的转换器

超高速串行总线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

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

答案2

看来您可以按顺序应用过滤器。

去年的这篇文章有一个很好的解释:

7-zip 的 -m 开关后面的数字代表什么意思?

如果您同时使用多个压缩操作,则该数字可让您设置压缩操作的顺序。

这是来自文档的一个例子:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

使用 BCJ2 过滤器将 *.exe 和 *.dll 文件添加到档案 a.7z,主输出流 (s0) 使用带有 32 MB 字典的 LZMA,BCJ2 的 s1 和 s2 输出流使用带有 512 KB 字典的 LZMA。

第一个压缩是最低的数字,即零。在此示例中,零设置为 BCJ2。然后是一,即 LZMA。二和三也是 LZMA,但它们使用的 d 参数不同。

-mb 选项用于将一种压缩的输出“绑定”到另一种压缩的输入。在此示例中,BCJ2 有一个输入和四个输出。输出零将发送到压缩一。输出一将发送到压缩二。输出二将发送到压缩三。输出三未绑定(因为它不需要再次压缩)。

相关内容