估计文件的可压缩性

iru*_*var 5 compression gzip

是否有一种快速而肮脏的方法来估计gzip文件的可压缩性而不必完全压缩它gzip

我可以,在bash,做

bc <<<"scale=2;$(gzip -c file | wc -c)/$(wc -c <file)"
Run Code Online (Sandbox Code Playgroud)

这为我提供了压缩系数,而无需将gz文件写入磁盘;这样我就可以避免用它的gz版本替换磁盘上的文件,如果由此产生的磁盘空间节省不能证明这个问题是合理的。但是通过这种方法,文件确实完全通过了gzip;只是输出通过管道传输到wc而不是写入磁盘。

有没有办法在不gzip处理所有内容的情况下对文件进行粗略的压缩性估计?

iru*_*var 5

这是Stephane Chazelas 解决方案的 Python 版本(希望是等效的)

python -c "
import zlib
from itertools import islice
from functools import partial
import sys
with open(sys.argv[1], "rb") as f:
  compressor = zlib.compressobj()
  t, z = 0, 0.0
  for chunk in islice(iter(partial(f.read, 4096), b''), 0, None, 10):
    t += len(chunk)
    z += len(compressor.compress(chunk))
  z += len(compressor.flush())
  print(z/t)
" file
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 4

例如,您可以尝试每 10 个块压缩一个以得到一个想法:

perl -MIPC::Open2 -nE 'BEGIN{$/=\4096;open2(\*I,\*O,"gzip|wc -c")}
                       if ($. % 10 == 1) {print O $_; $l+=length}
                       END{close O; $c = <I>; say $c/$l}'
Run Code Online (Sandbox Code Playgroud)

(此处为 4K 块)。