Estimativa da compressibilidade do arquivo

2

Existe uma maneira rápida e suja de estimar gzip -compressibilidade de um arquivo sem precisar compactá-lo totalmente com gzip ?

Eu poderia, em bash , fazer

bc <<<"scale=2;$(gzip -c file | wc -c)/$(wc -c <file)"

Isso me dá o fator de compactação sem precisar gravar o arquivo gz no disco; Dessa forma, posso evitar a substituição de um arquivo no disco por sua versão gz se a economia de espaço em disco resultante não justificar o problema. Mas com essa abordagem, o arquivo é realmente colocado completamente em gzip ; é só que a saída é canalizada para wc em vez de ser gravada no disco.

Existe uma maneira de obter uma estimativa aproximada de compressibilidade para um arquivo sem ter gzip funcionando em todo o seu conteúdo?

    
por iruvar 16.09.2014 / 18:48

2 respostas

4

Você pode tentar compactar um a cada 10 blocos, por exemplo, para ter uma ideia:

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

(aqui com blocos de 4K).

    
por 16.09.2014 / 20:23
2

Aqui está uma versão Python (esperançosamente equivalente) de Stephane Chazelas solution

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