Os arquivos tarar podem melhorar a compactação?

9

Tarar vários arquivos juntos pode melhorar a compactação com as ferramentas padrão, por exemplo, gzip, bzip2, xz?

Há muito tempo penso que seja esse o caso, mas nunca o testei. Se tivermos 2 cópias do mesmo arquivo de 20Mb de bytes aleatórios reunidos, um programa de compactação inteligente que percebe isso pode compactar o tarball inteiro para quase 20Mb.

Eu apenas tentei esse experimento usando gzip, bzip2 e xz para compactar 1) um arquivo de bytes aleatórios, 2) um tarball de duas cópias desse arquivo e 3) um gato de duas cópias desse arquivo. Em todos os casos, a compactação não reduziu o tamanho do arquivo. Isso é esperado para o caso 1, mas para os casos 2 e 3, o resultado ideal é que um arquivo de 40 Mb pode ser reduzido para quase 20 Mb. Essa é uma visão difícil para um programa de compactação, especialmente porque a redundância é distante, então eu não esperaria um resultado perfeito, mas eu ainda imaginava que haveria alguma compactaçã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

É geralmente o que eu deveria esperar?

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

Praxeolitic
fonte
Seus casos de teste são maus exemplos. Tente fazer seu teste com, por exemplo, um diretório de ~ 100 arquivos de texto (reais).
Lcd047
Por que é um mau exemplo? Sabemos exatamente o que esperar. Um arquivo aleatório não pode ser compactado e 2 de um arquivo aleatório podem ser compactados ao meio.
Praxeolitic
O conteúdo do arquivo "aleatório" é um problema. Eles são incompressíveis. Use dois arquivos de texto grandes diferentes para ter uma idéia melhor. Uma ideia relacionada aqui é "diferença de compressão normalizada". Você pode dar uma olhada em ims.cuhk.edu.hk/~cis/2005.4/01.pdf para ver que tipo de problemas você pode encontrar ao fazer esse tipo de teste.
precisa

Respostas:

11

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

http://www.bzip.org/1.0.3/html/memory-management.html

O gzip parece usar blocos de 32K.

Com 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

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

sem data
fonte
1
Sim, xz -8 encolhe o tarball e o gato no teste para 21M.
Praxeolitic
1
Há mais do que apenas o tamanho do bloco. Mas a história completa não é algo que possa ser explicado em alguns parágrafos do SE.
Lcd047
1
@Praxeolitic Um curso sobre compactação de dados pode ajudar.
Lcd047
1
@ lcd047 Compactação é um tópico enorme, mas a pergunta aqui foi simplesmente "por que isso não foi compactado" e a resposta é que a compactação funciona com padrões repetidos e o padrão que ele queria que demorasse mais tempo a ocorrer do que qualquer ferramenta procurava.
dataless
1
Também acho útil saber que "-9" na maioria dos compressores de linha de comando não significa "se esforçar mais para encontrar padrões", significa "considerar espaços de padrão maiores".
sem dados
2

O conteúdo do arquivo aleatório que você escolheu não é um bom exemplo - os tarfiles 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).

Porém, agrupar vários arquivos com conteúdo compactável normalmente produziria um tamanho total menor do tarfile do que quando os separar separadamente, especialmente quando o conteúdo for 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 padrão para alguns algoritmos de compactação) podem ser compartilhados por todos os arquivos no mesmo arquivo tar.

Dan Cornilescu
fonte
@kos Depende do algoritmo usado e dos dados. Os 33% citados são para um caso muito especial. Com o gzip e o bzip2, medi para 1000 arquivos de 1 MB gerados aleatoriamente, um aumento de <1% em cada arquivo.
Jofel
2

Como já indicado:

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

Um caso de teste melhor pode ser o seguinte:

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

(Nota: esperando que não haja montarias abaixo /usr!)

Você pode usar tar -jcfpara a compactação xz.

Agora, se test2.tar.gzfor menor que test1.tar.gz, o teste será bem-sucedido (ou seja, tarar arquivos e compactar é melhor do que comprimir e tarar). Meu palpite é que será, para muitos (ou seja, milhares) de arquivos. A desvantagem é que potencialmente levará mais tempo para ser executado, além de exigir muito mais espaço em disco, pois ele precisa criar o arquivo tar inteiro primeiro e depois compactá-lo. É por isso que o primeiro método é frequentemente usado, pois comprime cada arquivo em tempo real, mesmo que não dê um tarball tão pequeno.

Por exemplo, em nosso backup externo, normalmente fazemos 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 2 TB adicionais de disco.

quazza
fonte
Não -zcomprime o arquivo (ou seja, o tar)? Normalmente, o nome do arquivo de saída czftermina com .tar.gz para enfatizar isso.
Jari Keinänen