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

Algorithm 压缩实用程序如何将文件按顺序添加到压缩存档中?,algorithm,optimization,compression,gzip,tar,Algorithm,Optimization,Compression,Gzip,Tar,例如,当您tar-zcvfa目录时,您可以看到一个文件列表被顺序添加到最终的gzip文件中 但这是怎么发生的呢 任何基本级别的压缩算法都使用数据中的冗余来更好地表示数据,从而节省空间 但是当添加文件n时,已经选择了一种方式来表示第一个n-1文件,这可能不是最佳方式,因为直到遇到文件n之前,我们都不知道最好的方式是什么 我错过什么了吗?如果不是,这是否意味着所有这些压缩算法都选择了一些次优的数据表示形式?在gzip中,冗余被限制为特定的窗口大小(如果我没记错的话,默认为32k)。这意味着,在处理通

例如,当您
tar-zcvf
a目录时,您可以看到一个文件列表被顺序添加到最终的gzip文件中

但这是怎么发生的呢

任何基本级别的压缩算法都使用数据中的冗余来更好地表示数据,从而节省空间

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


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

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


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

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


你可以称之为“次优”,但它所带来的好处,如流式传输的能力,以及可能的错误恢复(如果windows之间有同步标记;不确定gzip在这里如何工作),都是值得的。

简单的回答是,它不——gzip以增量方式工作,因此,文件的第一部分通常不会像文件的后面部分那样被压缩

这样做的好处是,压缩数据本身包含构建“字典”以解压缩数据所必需的内容,因此您永远不必显式地将字典与数据一起传输

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

这可能是一个合理的权衡——如果您有一个相当高的确定性,即您将使用同一个字典压缩足够的数据,那么您可能会从改进的压缩中获得比传输字典所损失的更多的信息。但有一个问题:文件中数据的“字符”经常在同一个文件中发生变化,因此在文件的某个部分中效果最好的词典对于文件的不同部分可能根本就不是很好。这对于压缩包含多个组成文件的tar文件尤其相关,每个组成文件可能(也可能)具有不同的冗余

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


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

简单的回答是,gzip不是以增量方式工作的,因此文件的第一部分通常不会像文件的后面部分那样被压缩

这样做的好处是,压缩数据本身包含构建“字典”以解压缩数据所必需的内容,因此您永远不必显式地将字典与数据一起传输

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

这可能是一个合理的权衡——如果您有一个相当高的确定性,即您将使用同一个字典压缩足够的数据,那么您可能会从改进的压缩中获得比传输字典所损失的更多的信息。但有一个问题:文件中数据的“字符”经常在同一个文件中发生变化,因此在文件的某个部分中效果最好的词典对于文件的不同部分可能根本就不是很好。这对于压缩包含多个组成文件的tar文件尤其相关,每个组成文件可能(也可能)具有不同的冗余

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


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

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

tar -cvf X | gzip 
因此,
gzip
看到的只是它压缩的一堆字节,
tar
gzip
没有关于
tar
应该如何为
gzip
排序文件的对话