在64位平台上获取非常大的.gz文件的文件大小

时间:2009-12-27 09:18:57

标签: 64-bit 32-bit filesize gunzip gz

根据gz的具体情况,filesize保存在.gz文件的最后4个字节中。

我用

创建了2个文件
dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000

我gziped他们

gzip 500M 5G

我检查了最后4个字节

tail -c4 500M|od -I      (returns 512000000 as expected)
tail -c4 5G|od -I        (returns 825032704 as not expected)

似乎击中了看不见的32位屏障,使得写入ISIZE的值完全无稽之谈。哪个更令人讨厌,而不是他们使用了一些错误位。

有没有人知道从.gz获取未压缩的.gz文件大小而不提取它的方法?

感谢

规范:http://www.gzip.org/zlib/rfc-gzip.html

编辑: 如果有人尝试,你可以使用/ dev / zero而不是/ dev / urandom

3 个答案:

答案 0 :(得分:8)

没有一个。

获得压缩流的确切大小的唯一方法是实际去解压缩它(即使你把所有内容写入/ dev / null并只计算字节数)。

值得注意的是ISIZE被定义为

  

ISIZE(输入尺寸)
              它包含原始(未压缩)输入的大小
              数据模2 ^ 32。

在gzip RFC中,所以它实际上并没有<32>在<32>障碍中打破,你所看到的是预期的行为。

答案 1 :(得分:3)

我没有尝试使用您提到的大小的文件,但我经常会找到未压缩的大小的.gz文件

zcat file.gz | wc -c

当我不想留下未压缩的文件时,或者懒得再次压缩它。

显然,数据是未压缩的,但随后会传送到wc

无论如何,值得一试。

编辑当我尝试使用来自/ dev / random的数据创建一个5G文件时,它生成了一个大小为5120000000的文件5G,尽管我的文件管理器将此报告为4.8G

然后我使用gzip 5G对其进行压缩,结果5G.gz的大小相同(随机数据压缩不多)。

然后zcat 5G.gz | wc -c报告的大小与原始文件大小相同:5120000000字节。所以,无论如何,我的建议似乎都适用于这个试验。

感谢您等待

答案 2 :(得分:0)

gzip确实有-l选项:

       -l --list
          For each compressed file, list the following fields:

              compressed size: size of the compressed file
              uncompressed size: size of the uncompressed file
              ratio: compression ratio (0.0% if unknown)
              uncompressed_name: name of the uncompressed file

          The uncompressed size is given as -1 for files not in gzip format, such as compressed .Z files. To
          get the uncompressed size for such a file, you can use:

              zcat file.Z | wc -c

          In combination with the --verbose option, the following fields are also displayed:

              method: compression method
              crc: the 32-bit CRC of the uncompressed data
              date & time: time stamp for the uncompressed file

          The compression methods currently supported are deflate, compress, lzh (SCO compress -H) and pack.
          The crc is given as ffffffff for a file not in gzip format.

          With --name, the uncompressed name,  date and time  are those stored within the compress  file  if
          present.

          With --verbose, the size totals and compression ratio for all files is also displayed, unless some
          sizes are unknown. With --quiet, the title and totals lines are not displayed.