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


11

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、2、3、4、5没有重复的值,但是具有重复的差,因此增量变换可提高可压缩性。这就是Daniel B的答案。
2014年

我实际上不知道7zip的作用-只是评论您的“更改方法的顺序会显着影响文件大小”的逻辑。
2014年

Answers:


5

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

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

支持的过滤器:

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

BCJ转换器,用于x86可执行文件

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

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

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

IA64可执行程序的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

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


“在应用第一种压缩方法后,文件大小无法显着减小。” —当然可以。我的希望是,指定多个方法将使其按文件尝试每个指定的方法并选择最有效的方法。自然,这会使压缩速度大大降低。
索伦Kuklau

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.