分体式压缩包的压缩比



我有一个被分成几个文件的大型压缩包。 压缩包是 100GB 拆分为 12GB 文件。

tar czf - -T myDirList.txt | split --bytes=12GB - my.tar.gz.

尝试cat my.tar.gz.* | gzip -l退货

 compressed        uncompressed  ratio uncompressed_name
         -1                  -1   0.0% stdout

尝试gzip -l my.tar.gz.aa退货

 compressed        uncompressed  ratio uncompressed_name
12000000000          3488460670 -244.0% my.tar

连接文件cat my.tar.gz.* > my.tar.gz返回甚至更糟糕的答案

  compressed        uncompressed  ratio uncompressed_name
103614559077          2375907328 -4261.1% my.tar

这是怎么回事? 如何获得这些分体式压缩包的实际压缩比?

gzip 格式将未压缩的大小存储为流的最后四个字节。 gzip -l使用这四个字节和 gzip 文件的长度来计算压缩率。在这样做时,gzip 会寻求输入的末尾以获取最后四个字节。请注意,四个字节最多只能表示 4 GB - 1。

在第一种情况下,您无法在管道输入上查找,因此 gzip 放弃并报告 -1。

在第二种情况下,gzip 将拾取四个字节的压缩数据,实际上是四个随机字节,作为未压缩的大小,它必然小于 12,000,000,000,因此报告了负压缩率(扩展(。

在第三种情况下,gzip 获得实际的未压缩长度,但该长度模 232,必然远小于 103 GB,报告了更显着的负压缩率。

第二种情况是没有希望的,但第一种和第三种情况的压缩率可以使用 pigz 来确定,pigz 是 gzip 的并行实现,使用多个内核进行压缩。 pigz -lt解压缩输入而不存储它,以便直接确定未压缩字节数。(pigz -l就像gzip -l一样,也行不通。您需要测试t,即解压缩而不保存。

最新更新