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?
fonte
Respostas:
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:
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) ...
fonte
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.
fonte
Como já indicado:
Um caso de teste melhor pode ser o seguinte:
(Nota: esperando que não haja montarias abaixo
/usr
!)Você pode usar
tar -jcf
para a compactação xz.Agora, se
test2.tar.gz
for 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.
fonte
-z
comprime o arquivo (ou seja, o tar)? Normalmente, o nome do arquivo de saídaczf
termina com .tar.gz para enfatizar isso.