Por que os formatos de arquivo tar mudam para a compactação xz para substituir o bzip2 e o gzip?

202

Cada vez mais tararquivos usam o xzformato baseado no LZMA2 para compactação, em vez da bzip2(bz2)compactação tradicional . De fato, o kernel.org fez um anúncio tardio de " Adeus bzip2 " , 27 de dezembro de 2013 , indicando que as fontes do kernel seriam lançadas a partir deste momento no formato tar.gz e tar.xz - e na página principal do site o que é oferecido diretamente está no tar.xz.

Existem razões específicas para explicar por que isso está acontecendo e qual é a relevância gzipnesse contexto?


fonte

Respostas:

198

Para distribuir arquivos pela Internet, geralmente o seguinte é uma prioridade:

  1. Taxa de compressão (ou seja, quão pequeno o compressor torna os dados);
  2. Tempo de descompressão (requisitos de CPU);
  3. Requisitos de memória de descompressão; e
  4. Compatibilidade (quão amplo é o programa de descompressão)

Os requisitos de memória de compactação e CPU não são muito importantes, porque você pode usar uma máquina grande e rápida para isso e só precisa fazê-lo uma vez.

Comparado ao bzip2, o xz possui uma melhor taxa de compactação e menor (melhor) tempo de descompactação. No entanto - nas configurações de compactação normalmente usadas - requer mais memória para descomprimir [1] e é um pouco menos difundida. Gzip usa menos memória que qualquer um.

Portanto, os arquivos dos formatos gzip e xz são publicados, permitindo que você escolha:

  • Precisa descompactar em uma máquina com memória muito limitada (<32 MB): gzip. Dado, não é muito provável quando se fala de fontes do kernel.
  • Precisa descomprimir o mínimo de ferramentas disponíveis: gzip
  • Deseja economizar tempo de download e / ou largura de banda: xz

Não existe realmente uma combinação realista de fatores que levem você a escolher o bzip2. Então está sendo eliminado.

Eu olhei comparações de compactação em um post do blog . Não tentei replicar os resultados e suspeito que alguns deles tenham mudado (principalmente, espero que xztenha melhorado, pois é o mais novo).

(Existem alguns cenários específicos em que uma boa implementação do bzip2 pode ser preferível ao xz: o bzip2 pode compactar um arquivo com muitos zeros e seqüências de DNA do genoma melhor que o xz. As versões mais recentes do xz agora têm um modo de bloco (opcional) que permite a recuperação de dados após o ponto de corrupção e compactação paralela e [em teoria] descompactação. Anteriormente, apenas o bzip2 os oferecia. [2] No entanto, nenhum deles é relevante para a distribuição do kernel)


1: No tamanho do arquivo, xz -3está disponível bzip -9. Então xz usa menos memória para descomprimir. Mas xz -9(como, por exemplo, usado para tarballs do kernel do Linux), usa muito mais do que bzip -9. (E ainda xz -0precisa de mais do que gzip -9).

2: Alteração no sistema F21: lbzip2 como implementação padrão do bzip2

derobert
fonte
Algum comentário sobre o tópico tolerância a falhas ou é algo sempre implementado completamente fora dos algoritmos de compactação?
1
A resiliência @ illuminÉ não pode ser fornecida sem sacrificar a taxa de compressão. É um problema ortogonal e, embora existam ferramentas como o Parchive, para distribuir o tratamento de erros do TCP do kernel, o trabalho também.
Tobu
2
@ illuminÉ A tolerância a falhas (supondo que você queira dizer algo semelhante ao par2) normalmente não é uma preocupação com a distribuição de arquivos pela Internet. Os downloads são considerados confiáveis ​​o suficiente (e você pode apenas fazer o download novamente se estiver corrompido). Hastes e assinaturas criptográficas são frequentemente usadas e detectam corrupção e adulteração. Existem compressores que oferecem maior tolerância a falhas, embora ao custo da taxa de compressão. Parece que ninguém acha que a troca vale a pena para downloads HTTP ou FTP.
derobert
xz usa menos memória para descomprimir.
MichalH
@ Mike Ele mudou desde que escrevi isso? Em particular, a nota de rodapé um explica o uso da memória.
derobert
45

Primeiro de tudo, esta questão não está diretamente relacionada tar. O Tar apenas cria um arquivo não compactado, a compactação é aplicada mais tarde.

Sabe-se que o gzip é relativamente rápido quando comparado ao LZMA2 e bzip2. Se a velocidade importa, gzip(especialmente a implementação multithread pigz), geralmente é um bom compromisso entre a velocidade e a taxa de compactação. Embora existam alternativas se a velocidade for um problema (por exemplo, LZ4).

No entanto, se uma taxa de compressão alta for desejada, o LZMA2 supera bzip2quase todos os aspectos. A velocidade de compactação geralmente é mais lenta, mas descomprime muito mais rapidamente e fornece uma taxa de compactação muito melhor, com o custo de maior uso de memória.

Não há muitos motivos para usar bzip2mais, exceto a compatibilidade com versões anteriores. Além disso, o LZMA2 foi projetado com multithreading em mente e muitas implementações por padrão fazem uso de CPUs multicore (infelizmente xzno Linux ainda não faz isso). Isso faz sentido, pois as velocidades do relógio não aumentam mais, mas o número de núcleos aumenta.

Existem bzip2implementações multithread (por exemplo pbzip), mas elas geralmente não são instaladas por padrão. Observe também que os multithreads bzip2realmente valem a pena durante a compactação, enquanto a descompactação usa um único thread se o arquivo foi compactado usando um único thread bzip2, em contraste com o LZMA2. As bzip2variantes paralelas só podem aproveitar CPUs multicore se o arquivo foi compactado usando uma bzip2versão paralela , o que geralmente não é o caso.

Marco
fonte
4
Bem, alguns alcatrões criam uma zopção.
Tcrist
"speed" contribui para uma resposta confusa, você deve consultar a velocidade de compressão ou a velocidade de descompressão. Nem o pixz, o pbzip2 ou o pigz são instalados por padrão (ou usados ​​pelo tar sem o sinalizador -I), mas o pixz e o pbzip2 aceleram a compactação e descompactação e o pigz é apenas para compactação.
Tobu
O @Tobu xzserá multithread por padrão, portanto nenhuma pixzinstalação será necessária no futuro. Em algumas plataformas, o xzencadeamento já é suportado. Considerando bzip2que provavelmente nunca será multithread, já que o formato não foi projetado com o multithreading em mente. Além disso, pbzip2apenas acelera a descompactação se o arquivo tiver sido compactado, o pbzip2que geralmente não é o caso.
Marco Marco
1
@Marco Eu acredito que o lbzip2 permite a descompactação paralela de arquivos, mesmo que eles tenham sido compactados com uma implementação não paralela (por exemplo, estoque bzip2). É por isso que eu uso o lbzip2 sobre o pbzip2. (É possível que este tem evoluído desde o seu comentário.)
RaveTheTadpole
19

Resposta curta : xz é mais eficiente em termos de taxa de compressão. Assim, economiza espaço em disco e otimiza a transferência através da rede.
Você pode ver este Quick Benchmark para descobrir a diferença em testes práticos.

Slyx
fonte
Link quebrado.
flarn2006 10/06
18

O LZMA2 é um sistema de compressão de blocos, enquanto o gzip não é. Isso significa que o LZMA2 se presta a multithreading. Além disso, se ocorrer corrupção em um arquivo, geralmente você poderá recuperar dados de blocos subsequentes com o LZMA2, mas não poderá fazer isso com o gzip. Na prática, você perde o arquivo inteiro com o gzip subsequente ao bloco corrompido. Com um arquivo LZMA2, você perde apenas os arquivos afetados pelo (s) bloco (s) corrompido (s). Isso pode ser importante em arquivos maiores com vários arquivos.

Mark Warburton
fonte
2
Esta é uma distinção muito útil e importante, de fato!
leden