比较压缩:使用 gzip 对单个文件进行压缩与使用 gzip 对相同文件进行 tar 压缩

比较压缩:使用 gzip 对单个文件进行压缩与使用 gzip 对相同文件进行 tar 压缩

考虑一种假设的存档格式,给定要打包的文件列表,它在幕后执行以下操作:

  1. 分别对每个文件进行 gzip 压缩
  2. 将 gzip 文件放在一起

将此与传统的 tar 和 gzip 进行对比。

如果有的话,在什么情况下前一种方法会比后一种方法产生更好的压缩效果?

前一种方法的友好实现将允许更快地访问单个打包文件,以及立即访问索引。因此,我想知道在什么情况下,由于不考虑整个内容流,压缩率可能会降低,从而抵消这些优势。

答案1

  1. 各个压缩文件都有自己的标头,因此通过增加标头数量会降低压缩率。每个标头都很小,可能只有几百字节,但它们加起来就很大了。

  2. 压缩技术使用字典,将字典放在每个文件中也会增加开销。多个文件将使用同一份字典的部分内容来减少总文件大小。

  3. 无法压缩或压缩率非常小的数据如果单独压缩的话,其影响可以忽略不计。

  4. 压缩所需的时间会更长一些,因为它必须停止,将所有内容刷新到磁盘,并为每个文件启动一个新文件(新标题、字典等),而不是仅仅将数据附加到 1 个文件。

  5. 大量类似的文件,例如被压缩的数周的日志文件将共享字典并节省空间。

  6. 每个文件系统都使用大小均等的存储单元,在许多情况下为 4k,并且 4k 的一部分被浪费在每个文件上。

除非您要处理数千或数万个文件,否则无论使用哪种技术,保存或丢失的文件数量都不会很多。

答案2

尽管压缩率有所下降,但按照你的建议去做的一个更重要的原因是恢复损坏的档案。如果您将整个档案压缩在一起(即 tar cf - * | gzip > foo.tar.gz),然后让文件在磁盘上保留一段时间(或将其传输到很远的地方),那么一个损坏位可能会导致档案中损坏位以外的所有文件丢失。

首先单独压缩它们,然后将结果合并在一起,这样对位损坏的鲁棒性更强,因为 tar 几十年前从一开始就被设计用于从此类错误中恢复。如果 gzip 损坏了整个流,它就无法做到这一点,因为它无法因位错误而恢复其字典。

事实上,我正在考虑实施您的建议,因为我过去曾因单比特损坏而丢失了整个档案。现在我有数百万个文件占用了数 TB 的空间,我宁愿只占用几百 GB。虽然通过单独压缩文件,我可能会损失 2 倍,但我宁愿拥有一个 600GB 的档案,这个档案会丢失一些单独的文件,而不是一个 300GB 的档案,这个档案会丢失所有内容。

相关内容