Programa de compressão mostrando a taxa de compressão ao vivo

3

Alguns programas de compactação podem mostrar informações (como taxa de compactação ou totais de tempo e tamanho) durante a execução da tarefa, como xz -v :

--- %   2,580.2 KiB / 6,552.0 KiB = 0.394   1.2 MiB/s       0:05

Ao compactar um arquivo grande, gostaria de saber a taxa de compactação no meio da tarefa, para que eu possa interromper o processo se a taxa de compactação estiver baixa e deixá-lo descompactado.

Existem outros programas com esse recurso? ( xz tem alta taxa de compactação, mas é lento)

    
por golimar 09.05.2017 / 17:47

1 resposta

4

A maneira genérica de fazer isso é usar algo como pv para monitorar o tamanho de entrada e saída do programa de compactação. Por exemplo:

$ pv -cpterba -N in /dev/urandom | gzip | pv -cpterba -N out > /dev/null 
      out:  956MiB 0:00:42 [23.1MiB/s] [22.8MiB/s] [                           <=>        ]
       in:  956MiB 0:00:42 [23.1MiB/s] [22.8MiB/s] [                           <=>        ]

É fácil perceber que o tamanho da saída é o mesmo do tamanho da entrada - como esperado ao tentar compactar dados aleatórios.

Se em vez disso, tentarmos em um arquivo que comprima muito bem:

$ pv -cpterba -N in /dev/zero | gzip | pv -cpterba -N out > /dev/null 
      out: 2.62MiB 0:00:25 [ 109KiB/s] [ 107KiB/s] [                   <=>                ]
       in: 2.65GiB 0:00:25 [ 110MiB/s] [ 108MiB/s] [                   <=>                ]

O tamanho da saída é 2,62MiB, a entrada é 2,65GiB - 3 ordens de magnitude maiores.

Como benefício secundário, se usado em um arquivo normal, pv fornecerá um ETA:

$ pv -cpterba -N in debian-8.2.0-amd64-DVD-1.iso | gzip | pv -cpterba -N out > /dev/null 
      out:  578MiB 0:00:27 [22.1MiB/s] [21.4MiB/s] [                  <=>                 ]
       in:  595MiB 0:00:27 [22.1MiB/s] [  22MiB/s] [==>                   ] 15% ETA 0:02:25

A imagem do DVD do Jessie é composta principalmente por arquivos compactados, portanto, ela não é comprimida tão bem, mas levaria mais dois minutos e meio para ser concluída.

Você também pode usar pv -d para monitorar um processo já em execução - se você aplicar isso a um compressor em execução, ele lhe dirá onde está o arquivo de entrada versus o arquivo de saída, novamente permitindo ver rapidamente a proporção :

$ pv -pterba -d "$(pidof gzip)"
   3:/var/tmp/mp3s.tar:  911MiB 0:00:44 [  20MiB/s] [19.9MiB/s] [>         ]  9% ETA 0:07:35
   4:/var/tmp/mp3s.tar.gz:  906MiB 0:00:44 [  20MiB/s] [19.8MiB/s] [                <=>   ] 

Arquivos tar de MP3s também não compactam bem.

Nota: Muitos compressores funcionam em bloco por bloco. É por isso que você pode ver coisas como a taxa de transferência aumentando, sendo 0, repita. Você precisa deixar o compressor funcionar um pouco antes de obter uma idéia real da relação esperada. Tenha em mente que, logo após um pico, é provavelmente lido em um bloco, mas ainda não foi escrito a versão compactada - mas se você já esperou por 10 blocos, é no máximo 10% de erro.

(As opções pv que estou usando: -p para ativar a barra de progresso; -t para ativar o tempo decorrido; -e para ativar o ETA; -r para mostrar a taxa de transferência; -b para ativar o contador de bytes; -c para fazer vários pv s em um trabalho de canal; -N para definir os rótulos).

    
por 09.05.2017 / 19:59