压缩实用程序如何按顺序将文件添加到压缩存档?

时间:2011-04-24 19:19:34

标签: algorithm optimization compression gzip tar

例如,当您tar -zcvf目录时,您可以看到正在顺序添加到最终gzip文件的文件列表。

但这是怎么发生的?

最基本级别的任何压缩算法都使用数据冗余以更好的方式表示它,从而节省空间。

但是当添加文件n时,已经选择了一种方式来表示可能不是最佳文件的第一个n - 1文件,因为直到文件n遇到我们从未知道最好的方法是什么。

我错过了什么吗?如果不是,这是否意味着所有这些压缩算法都选择了一些次优的数据表示?

3 个答案:

答案 0 :(得分:3)

在gzip中,冗余仅限于特定的窗口大小(如果我没记错的话,默认为32k)。这意味着在处理经过该窗口的未压缩数据后,您可以开始编写压缩输出。

你可以称之为“次优”,但所提供的好处,例如流的能力,以及可能的错误恢复(如果窗口之间存在同步标记;不确定gzip如何在这里工作),是值得的。

答案 1 :(得分:2)

简短的回答是它没有 - gzip以递增方式工作,因此文件的第一部分通常压缩的程度与文件的后续部分一样多。

这一点的好处在于,压缩数据本身包含了构建解压数据的“字典”所需的内容,因此您无需使用数据显式传输字典。

有一些压缩方法(例如,两次通过Huffmany压缩),您可以扫描数据以找到该特定数据的理想“字典”,然后使用它压缩数据。但是,当您执行此操作时,通常必须将字典与数据一起传输,以便能够在接收端解压缩。

可以是一个合理的权衡 - 如果你有一个相当高的确定性,你将使用相同的字典压缩足够的数据,你可能从改进的压缩中获得比你更多的通过传输字典丢失。但是有一个问题:文件中数据的“字符”经常在同一个文件中发生变化,因此在文件的一个部分中效果最好的字典对于文件的不同部分可能不是很好。这对于压缩包含许多组成文件的tar文件特别相关,每个文件可能(并且可能会)具有不同的冗余。

gzip使用的增量/动态压缩处理得相当好,因为它使用的字典会根据最近看到的数据窗口自动/不断“调整”自身。主要的缺点是内置了一点“滞后”,所以在数据“字符”发生变化的地方,压缩会暂时下降,直到字典有机会“调整”变化。

两遍算法可以改进压缩数据,这些数据在您正在压缩的整个流中保持相似。增量算法往往可以更好地适应更多变量数据。

答案 2 :(得分:1)

当你说tar -zcvf X时,这相当于说:

tar -cvf X | gzip 

所有gzip看到的是它压缩的一堆字节,targzip没有关于tar如何为{gzip订购文件的对话1}}以优化方式压缩整个流。并且gzip不知道tar数据格式,因此无法重新排列内容以获得更好的压缩效果。