为什么7zip文件比原始文件大?[重复]


37

可能重复:
为什么ZIP压缩不压缩任何内容?

我尝试7zip压缩.exe文件,但实际上它变大了。

在此处输入图片说明

这是预期的结果吗?


3
是的,这是预期的结果。为什么?因为当某事物已经被压缩(=使用较小的可能空间)时,它无法进一步压缩。
woliveirajr 2012年

4
只是要添加到其他所有人中-由于该exe文件专门是安装程序,因此其大部分内容可能是zip或cab存档。您不会从普通exe文件中获得相同的结果(但是大多数普通exe文件不会是145 MB)
Random832

1
仅使用基本逻辑的解释:压缩会为原始文件找到一个UNIQUE压缩文件,并为压缩文件找到UNIQUE原始(未压缩)原始文件。假设您有8位文件,并想将它们压缩为5位文件。有256个唯一的8位文件,但只有32个唯一的5位文件(!),因此必须将某些8位文件压缩为同一5位文件(!)。如果将2个不同的原始文件压缩到同一个ZIP文件中,则要在解压缩后获取哪个文件?对于任何压缩方法,如果存在压缩后变得更小的文件,则必须存在变大的文件(!)
Ivan Kuckir 2015年

Answers:


78

它归结为一个叫做的概念。参见维基百科

基本思想是,如果存在始终可以使文件变小的压缩操作,则逻辑指示所述压缩操作将能够将任何文件减少为0字节,并且仍然保留所有数据。但这是荒谬的,因为我们知道0字节根本无法传达任何信息。因此,我们刚刚证明了不存在一种压缩算法,该压缩算法总是会使输入变小,因为在这种情况下,任何信息都可以存储在0字节中,但是0字节表示没有信息,因此您可以同时没有信息和所有信息。因此,这是荒谬的。

由于这个理论上的概念,您使用的每个压缩程序都会增加某些输入 的大小(或者最好保持相同的大小)。也就是说,对于您设计或使用的任何压缩算法,都会有一些输入变小,而有些则不会。

由于大多数无损压缩算法都基于相同的理论原理,因此已经压缩的数据通常是进一步压缩的可怕选择。它能够进一步压缩性差压缩数据; 但这要比简单地使用最佳算法从原始数据开始压缩来效率低。

例如,如果您有一个100 MB的文本文件,并使用常规的Zip算法对其进行压缩,则可能会将其压缩到50 MB。如果随后使用LZMA2压缩Zip文件,则可能会将其压缩到40或45 MB,因为LZMA 对大多数可压缩数据的压缩率比Zip高。因此,有理由认为它也可以压缩Zip数据,因为Zip不会完全吸收所有熵。但是,如果您完全消除了Zip容器,则可以通过使用LZMA2压缩原始文本来缩小它的大小,从而可能产生大约30-35 MB的大小(这些只是“空中数字”,以说明这一概念) 。

对于要压缩的二进制文件,它会更大,因为7-Zip文件格式必须创建自己的内部结构,并将已经压缩的可执行文件的数据打包为7-Zip格式。它包含字典,文件头等内容。这些额外的数据通常可以通过压缩数据本身而节省下来,但是看起来您要压缩的可执行文件已经使用某种形式的LZMA进行了压缩。否则,它可能会缩小可执行文件的大小或将其稍微增加一点,而不是将其增加2 MB(这是很大的)。


顺便说一句,回答这个问题最重要的部分就在结尾:“其中包含诸如字典,文件头之类的内容。这些额外的数据通常可以通过压缩数据本身节省下来,以弥补这一不足,但是看来,你试图压缩可执行文件是某种形式的LZMA的”已压缩
jhocking

6
@jhocking:不,最重要的部分是中间: “您使用的每个压缩程序都会增加...一些输入的大小。” 7zip的文件格式具有一个dictionary / file-header / etc,但是即使7zip使用的算法没有任何这些东西,我们仍然可以保证某些(实际上,大多数)输入将具有大于或大于输入本身。这是信息理论的基本事实,与文件头无关。
BlueRaja-Danny Pflughoeft 2012年

2
@Mehrdad确保:只需编写一个“压缩”算法,该算法始终返回原始输入。那里; 完成。:P ...除此之外,无-任何这是在所有的算法压缩算法都将有一些元数据,即使是在指示文件是否被压缩的文件开始只是一个位(0 ==未压缩,1 ==压缩)。如果要修改文件ALL的内容,则需要一些元数据。而且,如果您要修改内容,您将要增加一些输入。
allquixotic

1
但是,如果您的问题是“是否有任何压缩算法不会将输入的长度增加到超过固定数量的元数据”,答案是:我不知道,但是从理论上讲应该可以这样做。其实很容易。所有你需要做的是开发出可以在容器格式或者包含原始文件,压缩数据流。然后,在创建存档时,尝试压缩:如果压缩后的大小大于输入的大小,则只需存储原始输入并将元数据打包在前面。文件大小将增加,但是如果元数据很小(续)
allquixotic14年

2
@Mehrdad:“是否有不增加任何输入长度的压缩算法(但较差)? ”-答案是否定的。有2^(n+1)-1大小为n位或更少的可能消息。我们的算法必须将每个映射到唯一的输出。如果其中的一个甚至映射到一个位数更少的值,则另一个值也必须映射到一个位数更多的值。
BlueRaja-Danny Pflughoeft 2015年

7

7z中使用的基础压缩算法是无损的。这意味着您可以迭代地多次压缩/解压缩文件。此外,每次迭代后,文件将保持完全相同

不幸的是,您不能期望无损压缩算法被多次应用并始终获得肯定的结果。有一个严格的界限,它不能越过。大致而言,该边界取决于输入序列与随机数据的融合程度。最重要的是,无损算法用于文件压缩,Internet HTML数据传输,备份和其他期望将输出文件解压缩为完全相同的原始输入文件的操作。

无损压缩相比,您可能总是希望使用有损(或有损)压缩算法在压缩后减小文件大小。不利的一面是,您无法在一次压缩/解压缩迭代之后完全恢复原始文件。这些算法在音频/视频/图像传输和存储方面最为著名。

7z格式使用的bzip2LZMALZMA2和其他算法都是无损的。因此,将有一个限制,在该限制之后它将无法再压缩。最重要的是,可执行映像(.exe)通常是高度压缩的文件。7zip和许多其他压缩工具一样,会嵌入一些元数据,实际上这会使输出文件变大。

脑筋急转弯:如果我们确实采用了可以始终减小文件大小的无损算法,该怎么办?

在这种情况下,您将始终看到压缩文件小于输入文件。看到下面的评论为什么它不可能。


5
通过污染证明。假设: 假设始终可以使用无损算法压缩文件。 步骤1。单次压缩使输出文件至少小一位。如果是这样,经过多次迭代,我们最终将得到一个只有两位的文件。步骤2下一次迭代将生成一个大小为1位的文件。步骤3但是压缩算法是无损的,这意味着只允许一个有效的解压缩。显然,您无法从1个压缩位恢复2个原始位-您将不得不猜测。最后一点违反了假设。
oleksii

您不能保证使用一种使文件更小的算法,但是可以保证在这种情况下不应用“压缩”不会增加文件大小。为了使文件大小实际上没有增加,您必须带外指示(例如,在文件名中)。
jeteon

@jeteon我不确定您要说什么。
oleksii 2015年

我只是补充说,由于您始终可以选择不压缩输入,因此可以使用一个压缩程序,该程序根本不会压缩文件。基本上,如果您确定压缩版本大于未压缩版本,则只需保留它即可。然后,您还必须以某种方式指出这种情况,而无需增加输出的大小,以便解压缩器知道未压缩文件。在不增加文件大小的情况下执行此操作的唯一方法是执行类似更改文件名的操作。
jeteon

@jeteon哦,我明白了。是的,有道理。
oleksii 2015年

6

如果原始可执行文件已经被压缩(或包含大量压缩的数据或不可压缩的数据),那么压缩它会增加大小。


2

大多数压缩算法使用什么叫做符号表,basicly只是它使用,因为它的元素文件的peices CAN压缩。当然,这会在文件中产生一些开销,但通常会导致文件小得多。

在已经压缩的文件中,它仍然会创建一组符号,但是几乎没有什么可以减小尺寸的。在您的情况下,已压缩文件的符号表可能在2 MB附近,或者如果确实进行了一些压缩,则可能会更大。


0

压缩思想:

压缩软件会创建文件列表并消除重复的内容。

压缩已经压缩的文件时,压缩后的文件可能会比原始文件大。

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.