拆分 tarball 的压缩率

Compression ratio for split tarballs

我有一个很大的 tarball,它被分成几个文件。 tarball 是 100GB 分成 12GB 文件。

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

正在尝试 cat my.tar.gz.* | gzip -l returns

 compressed        uncompressed  ratio uncompressed_name
         -1                  -1   0.0% stdout

正在尝试 gzip -l my.tar.gz.aa returns

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

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

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

这是怎么回事?我怎样才能得到这些拆分 tarball 的真实压缩率?

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

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

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

在你的第三种情况下,gzip 得到的是实际未压缩的长度,但该长度模 232,这必然要少得多超过 103 GB,报告了更显着的负压缩率。

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