Os arquivos tarring podem melhorar a compactação?

9

A segmentação de vários arquivos juntos melhora a compactação com as ferramentas padrão, por exemplo, gzip, bzip2, xz?

Eu tenho pensado que este é o caso, mas nunca testei isso. Se tivermos 2 cópias do mesmo arquivo de 20Mb de bytes aleatórios, juntos, um programa de compressão inteligente que perceba isso poderia comprimir o tarball inteiro em quase 20Mb.

Eu apenas tentei este experimento usando gzip, bzip2 e xz para comprimir 1) um arquivo de bytes aleatórios, 2) um tarball de duas cópias daquele arquivo, e 3) um gato de duas cópias daquele arquivo. Em todos os casos, a compactação não reduziu o tamanho do arquivo. Isto é esperado para o caso 1, mas para os casos 2 e 3 o resultado ótimo é que um arquivo de 40Mb pode ser reduzido para quase 20Mb. Essa é uma visão difícil para um programa de compressão enxergar, especialmente porque a redundância é distante, então eu não esperaria um resultado perfeito, mas eu ainda imaginei que haveria alguma compressão.

Teste:

dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*

Resultado:

20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1]   Done                    gzip -k random*
[2]-  Done                    bzip2 -k random*
[3]+  Done                    xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz

Isso geralmente é o que eu devo esperar?

Existe uma maneira de melhorar a compactação aqui?

    
por Praxeolitic 25.06.2015 / 19:12

3 respostas

11

Você está contra o "tamanho de bloco" do compressor. A maioria dos programas de compactação quebra a entrada em blocos e compacta cada bloco. Parece que o tamanho do bloco bzip só sobe para 900K, por isso não verá nenhum padrão que demore mais do que 900K bytes para repetir.

link

O gzip parece usar 32K blocos.

Com o xz você está com sorte! Na página do manual:

   Preset   DictSize   CompCPU   CompMem   DecMem
     -0     256 KiB       0        3 MiB    1 MiB
     -1       1 MiB       1        9 MiB    2 MiB
     -2       2 MiB       2       17 MiB    3 MiB
     -3       4 MiB       3       32 MiB    5 MiB
     -4       4 MiB       4       48 MiB    5 MiB
     -5       8 MiB       5       94 MiB    9 MiB
     -6       8 MiB       6       94 MiB    9 MiB
     -7      16 MiB       6      186 MiB   17 MiB
     -8      32 MiB       6      370 MiB   33 MiB
     -9      64 MiB       6      674 MiB   65 MiB

so "xz -8" encontrará padrões de até 32MB e "xz -9" até padrões de 64MB. Mas cuidado com o quanto de memória RAM é necessário para realizar a compactação (e para descompactar) ...

    
por 25.06.2015 / 19:32
2

O conteúdo do arquivo aleatório que você escolheu não é um bom exemplo - os arquivos tar compactados serão maiores que os originais. Você verá o mesmo com arquivos em formatos já compactados (muitos formatos de imagem / áudio / vídeo, por exemplo).

Mas unir vários arquivos com conteúdo compactável normalmente produziria um tamanho total de tarfile menor do que quando tarados separadamente, especialmente quando o conteúdo é semelhante (por exemplo, arquivos de log do mesmo programa). O motivo é que alguns dos dados de compensação de compactação por arquivo (como matrizes de padrões para alguns algoritmos de compactação) podem ser compartilhados por todos os arquivos no mesmo arquivo tar.

    
por 25.06.2015 / 19:41
2

Como já foi indicado:

  1. O uso de arquivos aleatórios não é bom, pois eles já contêm "entropia de informações" máxima, portanto, não serão compactados;
  2. Você precisa empacotar muito de arquivos para uma comparação justa.

Um caso de teste melhor pode ser este:

cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h

(Nota: Esperando que não haja montagens sob /usr !)

Você pode usar tar -jcf para compactação xz.

Agora, se test2.tar.gz for menor que test1.tar.gz, o teste será bem-sucedido (ou seja, arquivos tarring e, em seguida, a compactação será melhor do que compactar e, em seguida, tarring). Meu palpite é que será, por muito (ou seja, milhares) de arquivos. A desvantagem é que ele levará mais tempo para ser executado, além de exigir muito mais espaço em disco, já que ele precisa primeiro compilar todo o arquivo tar e depois compactá-lo. É por isso que o primeiro método é frequentemente usado, pois comprime cada arquivo em tempo real, mesmo que não seja tão pequeno.

Por exemplo, em nosso backup fora do local, normalmente estamos fazendo backup de 4.000.000 de arquivos, totalizando cerca de 2 TB. Portanto, o primeiro método é muito mais rápido e não requer mais 2 TB de disco.

    
por 26.06.2015 / 02:17