拆分压缩比的压缩比

时间:2017-06-30 15:59:20

标签: compression gzip tar

我有一个大型tarball,它被分成几个文件。 tarball是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

这里发生了什么?如何获得这些拆分tarball的实际压缩比?

1 个答案:

答案 0 :(得分:1)

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

在您的第一种情况下,您无法搜索管道输入,因此gzip会放弃并报告-1。

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

在你的第三种情况下,gzip正在获得实际的未压缩长度,但该模块的长度为2 32 ,这必然远小于103 GB,报告的更多显着的负压缩比。

第二种情况是没有希望的,但第一种和第三种情况的压缩率可以使用pigz来确定,http://www.jqueryscript.net/demo/Smart-jQuery-Pan-Zoom-Plugin-Smart-jQuery-Zoom/example/是使用多个核进行压缩的gzip的并行实现。 pigz -lt解压缩输入而不存储它,以便直接确定未压缩字节的数量。 (pigz -l就像gzip -l一样,也不会工作。您需要t进行测试,即无需保存即可解压缩。)