为什么zip压缩时显示0%的压缩率?

16

我想要压缩一个包含4个非常相似的大文件的文件夹,所以我期望它的大小会被减小。

这是我在Linux/Fedora上使用的命令:

zip -9 myarchive.zip -r myfolder -P mypassword

我得到了回应:

adding: myfolder/ (stored 0%)
adding: myfolder/Program1.exe (deflated 0%)
adding: myfolder/Program2.exe (deflated 0%)
adding: myfolder/Program3.exe (deflated 0%)
adding: myfolder/Program4.exe (deflated 0%)

然后我得到了归档文件,大小几乎与我的原始文件夹相同。

似乎没有发生任何压缩。为什么?


如果省略了“-P mypassword”,会发生什么? - Aaron Digulla
2
并非所有数据都可以被压缩。 - Roman Newaza
当我省略-P mypassword时,它是相同的。 - John Smith Optional
不是所有的数据都可以被压缩。但看起来压缩率为0%(否则,“deflated 0%”表示什么?)。并且正如我所说,这4个文件非常相似,因此应该进行压缩。或者zip只压缩每个文件而不是整个文件夹?这将非常遗憾。 - John Smith Optional
4个回答

22
与tar+gzip不同,zip为每个文件使用一个新的压缩表,因此即使四个文件完全相同,它也会尝试单独压缩每个文件。
技术上,tar也会看到每个文件,但它将它们连成一个长输入,供gzip使用,因此压缩步骤针对一个巨大的输入进行,这就是为什么tar+gzip通常比zip产生更小的结果的原因。
问题是为什么你的exe文件无法压缩。exe文件通常包含大量易于压缩的数据,因此它们应该至少缩小30%("deflate")。也许这些文件被加密或混淆了;这些过程使结果难以压缩。

谢谢,那么如果zip压缩每个文件,这就有意义了。这些文件是自解压的exe文件,它们包含一个小的可执行文件+一个大的压缩库dll文件+一些图片。图像和库已经被压缩,并且对于每个文件来说几乎都是相同的。 - John Smith Optional

4

Deflated 0%表示它尝试进行压缩,但实际上没有压缩效果。如前所述,zip格式无法利用不同条目之间的相似性。tar + gzip可以利用相似性,但仅当相似性距离少于32K字节时才能实现。其他格式可以利用更长距离的相似性,例如xz。

未压缩的可执行文件通常可以压缩30%至50%,这意味着您的可执行文件可能是a)通过UPX等方式压缩的,b)它们是自解压缩数据,其中解压器存储在压缩数据之前,c)它们是具有大量压缩数据的非常短的可执行文件,或d)它们大多数是加密的。


3

感谢您的建议和链接。是的,我的文件是自解压可执行文件(请参见我给Aaron的回复)。感谢您的时间! - John Smith Optional

2

有些文件无法压缩,尤其是当它们的熵很高时。这种情况发生在字节的统计分布均匀的时候(例如当字节0出现的频率与字节1,2等一样多)。这通常发生在已经被压缩过的内容中,如某些视频或音频格式。


我认为每个文件的熵都很高,但它们非常相似。两个给定文件之间的差异可能不到1%。因此,在考虑整个文件夹时存在很多冗余。 - John Smith Optional
“deflated 0%” 是什么意思?我在原始帖子中忘记问了。感谢您的帮助。 - John Smith Optional

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接