Qual é a diferença entre os diferentes sistemas de "compressão"?


9

Eu sempre usei TAR e ZIP para compactação, mas recentemente ouvi falar sobre o *.Zalgoritmo de compactação. Isso me trouxe uma pergunta:

Com todos esses sistemas de compactação, qual é o melhor para uso geral e compactação?

Executando alguns testes, descobri que tar, como descobri, NÃO é realmente compactado (a menos que especificado explicitamente). Significado, para que serve se comparado a outros métodos de compactação?

Já estou ciente de que ZIP é o sistema de compressão mais utilizado, mas devo usá-lo em vez de *.Z, *.7z, .tarou .tar.<insert ending here>?

Resumo da publicação:

  1. Devo usar *.tar, *.Z, *.7z, .tar, ou .tar.<insert ending here>para a melhor compressão?
  2. Se a planície *.tarnão é compactada, por que a usamos?

EDIT: Nem todos os algoritmos permitem armazenar permissões do Linux (pelo que aprendi). Quais são e existe algum tipo de hack (ou script) que eu poderia usar para armazenar permissões?


Não há necessidade de dizer essas coisas, apenas quer escolher o top votado um ou o que você encontrou o mais útil :)
Seth

Respostas:


17

tarsignifica arquivo de fita. Tudo o que faz é empacotar arquivos e seus metadados (permissões, propriedade etc.) em um fluxo de bytes que podem ser armazenados em uma unidade de fita (ou em um arquivo) e restaurados posteriormente. A compactação é uma questão totalmente separada que você costumava canalizar a saída através de um utilitário externo para compactar, se quisesse. O tar do GNU foi bom o suficiente para adicionar opções para dizer a ele para filtrar automaticamente a saída através do utilitário apropriado como um atalho.

Zip e 7z combinam o arquivamento e a compactação em seu próprio formato de contêiner e destinam-se a compactar arquivos em um sistema DOS / Windows, para que não armazenem permissões e propriedade unix. Portanto, se você deseja armazenar permissões para backups adequados, é necessário manter o tar. Se você planeja trocar arquivos com usuários do Windows, o zip ou o 7z é bom. Os algoritmos de compactação reais, zip e 7zip, podem ser usados ​​com tar, por uzing gzipe lzmarespectivamente.

O lzma (também conhecido como * .xz) possui uma das melhores taxas de compactação e é bastante rápido na descompactação, tornando-a a melhor opção atualmente. No entanto, exige uma tonelada de memória RAM e tempo de CPU para compactar. O venerável gzipé um pouco mais rápido na compactação, portanto, pode ser usado se você não quiser dedicar tanto tempo de CPU. Ele também possui uma variante ainda mais rápida chamada lzop. bzip2ainda é bastante popular, pois substituiu o gzip por um tempo antes da criação do 7zip / lzma, uma vez que obteve melhores taxas de compactação, mas está desvalorizando atualmente, já que o 7z / lzma é mais rápido na descompressão e obtém melhores taxas de compactação. O compressutilitário, que normalmente nomeia arquivos * .Z, é antigo e há muito esquecido.

Uma das outras diferenças importantes entre zip e tar é que o zip compacta os dados em pequenos pedaços, enquanto que ao compactar um arquivo tar, você comprime tudo de uma vez. O último fornece melhores taxas de compactação, mas para extrair um único arquivo no final do arquivo, você deve descompactar tudo para obtê-lo. Assim, o formato zip é melhor para extrair um ou dois arquivos de um arquivo grande. 7z e darpermita que você escolha comprimir a coisa toda (chamada modo "sólido") ou pequenos pedaços para facilitar a extração por partes.


Mas, apenas o TAR suporta metadados? Ou será que gzip / bzip2 também agora suportam metadados
Kaz Wolfe

@pacificfils, os utilitários de compactação compactam apenas um único arquivo, sem metadados.
psusi

pode tar uma pasta e, em seguida, colocá-lo em um zip e preservar as permissões embora?
Kaz Wolfe

@pacificfils, sim, mas seria um pouco bobo, já que você abriria mão dos benefícios do zip e da melhor taxa de compactação gzip.
psusi

@pacificfils tar cfppreservará as permissões. Um arquivo tar é descompactado, portanto, zip (7-zip), gzip2, gzip, lzo, etc compactará bem um arquivo tar (em geral, é improvável que um tar de arquivos compactados seja compactável).
Elliott Frisch

9

Os detalhes dos algoritmos estão fora de tópico aqui 1, uma vez que não são de forma alguma específicos para o Linux, muito menos para o Ubuntu. Você encontrará, no entanto, algumas informações interessantes aqui .

Agora tar, como você disse, tarnão é e nunca foi um programa de compactação. Em vez disso, é um arquivador ; seu objetivo principal é criar um arquivo grande dentre muitos pequenos. Historicamente, isso era para facilitar o armazenamento em unidades de fita, daí o nome: Tape ARchive.

Hoje, o principal motivo para usar taré diminuir o número de arquivos no seu sistema. Cada arquivo em um sistema de arquivos Unix ocupa um inode , quanto mais arquivos você tiver, menos inodes disponíveis e quando você ficar sem inodes, não será mais possível criar novos arquivos. Simplificando, a mesma quantidade de dados armazenados como milhares de arquivos ocupará mais do seu disco rígido do que os mesmos arquivos em um único arquivo tar.

Para ilustrar, como isso foi contestado nos comentários, na minha /partição 68G , tenho o seguinte número de inodes totais e usados ​​(lembre-se de que a contagem de inodes depende do tipo de sistema de arquivos e do tamanho da partição):

Inode count:              393216
Free inodes:              171421

Se eu agora tentar criar mais arquivos do que os inodes:

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

Não há espaço? Mas eu tenho muito espaço:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

Como você pode ver acima, a criação de algumas centenas de milhares de arquivos vazios esgota rapidamente meus inodes e não posso mais criar novos. Se eu fosse a taresses, seria capaz de começar a criar arquivos novamente.

Ter menos arquivos também acelera bastante a E / S do sistema de arquivos, especialmente em sistemas de arquivos montados em NFS. Eu sempre tar meus diretórios de trabalho antigos quando um projeto é concluído, uma vez que, quanto menos arquivos eu tenho, mais rápidos os programas como findele funcionam.

Há uma ótima resposta sobre o Superusuário que entra em muito mais detalhes, mas, além do exposto, os outros motivos básicos pelos quais tarainda hoje são populares são:

  1. Eficiência: usar tarpara canalizar através de um programa de compactação gzipé mais eficiente, pois evita a criação de arquivos intermediários.

  2. tar vem com todos os tipos de sinos e assobios, recursos que foram projetados ao longo de sua longa história que o tornam particularmente útil para backups * nix (permissões de permissões, propriedade de arquivos, a capacidade de canalizar dados diretamente para STDOUT e por um link SSH ... )

  3. Inércia. Estamos acostumados tar. É seguro assumir que ele estará disponível em qualquer * nix que você possa usar, o que o torna muito portátil e útil para tarballs de código-fonte.


1 Isso é absolutamente verdade e não tem nada a ver com o fato de eu não saber o suficiente sobre eles para explicar :)


3
Meu computador tinha (no passado) mais de 10.000.000 de arquivos, e isso não é realmente muito louco. Eu nunca uso tarpara "reduzir o número de arquivos", já que a maioria dos sistemas de arquivos não se importa, e isso não é o ideal, pois tarnão suporta fácil acesso aleatório a arquivos. Em vez disso, o principal uso (para mim e para a maioria das pessoas) é compartilhar arquivos (por exemplo, código fonte) com outras pessoas de uma maneira simples.
nneonneo

@nneonneo Você já teve que trabalhar com milhões de arquivos em um único diretório? Eu tenho e acredite em mim, não é fácil. Além dos problemas óbvios ARG_MAX, isso pode tornar o tratamento dos arquivos de qualquer maneira um aborrecimento e pode realmente trazer uma rede (mal) configurada, na qual os arquivos são armazenados em um servidor central e compartilhados com o NFS. Quanto à redução do número total de arquivos, você precisará de mais arquivos do que isso para notar, mas nas configurações de vários usuários, o número de inodes pode realmente se tornar limitante.
terdon

@nneonneo para dar um exemplo mais concreto, tune2fs -lna partição que contém meu $ HOME diz que tenho 19.300.352 inodes. Não poderei criar mais arquivos que isso. Como você disse, 10 ^ 6 não é louco, nem mesmo nas faixas mais altas. Dependendo do que você está fazendo, você pode precisar muito mais do que isso.
terdon

@nneonneo Veja a resposta atualizada para um exemplo do mundo real de como você pode facilmente ficar sem inodes.
terdon

Meu servidor está usando pouco mais de 1 milhão de inodes e isso é apenas porque eu tenho uma tonelada métrica de e-mail (muitas listas de e-mail de alto tráfego há anos) e as armazeno no formato Maildir. Não tenho ideia do que você poderia estar fazendo para usar 19 milhões de inodes. Você precisaria criar um novo arquivo a cada segundo, 24 horas por dia, por mais de 7 meses.
Psusi 20/03/14

4

Existem duas tarefas distintas, mas relacionadas. O empacotamento de uma árvore de arquivos (incluindo nomes de arquivos, estrutura de diretórios, permissões do sistema de arquivos, propriedade e outros metadados) em um fluxo de bytes é chamado de arquivamento . A remoção de redundância em um fluxo de bytes para produzir um fluxo de bytes menor é chamada de compactação .

No Unix, as duas operações são separadas, com ferramentas distintas para cada uma. Na maioria das outras plataformas (atuais e históricas), as ferramentas combinadas executam arquivamento e compactação.

(gzip e outros programas que imitam a interface do gzip geralmente têm a opção de armazenar o nome do arquivo original na saída compactada, mas esse, juntamente com um CRC ou outra verificação para detectar corrupção, é o único metadado que eles podem armazenar.)

Há vantagens em separar a compactação do arquivamento. O arquivamento é específico da plataforma (os metadados do sistema de arquivos que precisam ser preservados variam muito), mas a implementação é direta, basicamente ligada à E / S e muda pouco ao longo do tempo. A compactação é independente da plataforma, mas as implementações são vinculadas à CPU e os algoritmos estão em constante aprimoramento para aproveitar o aumento de recursos que o hardware moderno pode trazer para o problema.

O arquivador Unix mais popular é tar, embora existam outros como cpioe ar. (Pacotes Debian são ararquivos, embora cpioseja frequentemente usado para ramdisks iniciais.) tarÉ ou foi frequentemente combinado com ferramentas de compactação como compress(.Z), gzip(.gz), bzip2(.bz2) e xz(.xz), do mais antigo ao mais novo e não por coincidência da pior para a melhor compactação.

Criar um tararquivo e compactá-lo são etapas distintas: o compressor não sabe nada sobre o tarformato do arquivo. Isso significa que extrair um único arquivo de um tararquivo compactado exige descompactar todos os arquivos anteriores. Isso geralmente é chamado de arquivo "sólido".

Da mesma forma, como o tar é um formato de "streaming" - necessário para que seja útil em um pipeline - não há índice global em um arquivo tar, e listar o conteúdo de um arquivo tar é tão caro quanto extraí-lo.

Por outro lado, o Zip, o RAR e o 7-zip (os arquivadores mais populares nas plataformas modernas do Windows) geralmente compactam cada arquivo separadamente e compactam os metadados levemente, se houver. Isso permite a listagem barata dos arquivos em um archive e a extração de arquivos individuais, mas significa que a redundância entre vários arquivos no mesmo archive não pode ser explorada para aumentar a compactação. Enquanto, em geral, compactar um arquivo já compactado não reduz ainda mais o tamanho do arquivo, ocasionalmente você pode ver um arquivo zip dentro de um arquivo zip: o primeiro compactar transformou muitos arquivos pequenos em um arquivo grande (provavelmente com a compactação desativada), e o segundo compactar e depois compactar como uma única entidade.

Há polinização cruzada entre as diferentes plataformas e filosofias: gzipé essencialmente zipo compressor sem seu arquivador e xzé essencialmente 7-zipo compressor sem seu arquivador.

Existem outros compressores especializados. As variantes de PPM e seus sucessores ZPAQsão otimizados para máxima compactação sem levar em consideração o consumo de recursos. Eles podem consumir facilmente a CPU e a RAM que você puder usar, e a descompressão é tão cansativa quanto a compactação (por outro lado, as ferramentas de compactação mais usadas são assimétricas : a descompactação é mais barata que a compactação).

Na outra extremidade do espectro, lzo, snappye LZ4são compressores "leves" concebidos para uma velocidade máxima e mínima do consumo de recursos, ao custo de compressão. Eles são amplamente utilizados em sistemas de arquivos e outros armazenamentos de objetos, mas menos como ferramentas independentes.


Então, qual você deve escolher?

Arquivamento:

Como você está no Ubuntu, não há motivo real para usar outra coisa senão o tararquivamento, a menos que você esteja tentando criar arquivos que sejam facilmente legíveis em outros lugares.

zipé difícil de superar pela onipresença, mas não é centrado no Unix e não mantém as permissões do sistema de arquivos e as informações de propriedade, e sua compactação é antiquada. 7-zip e RAR (e ZPAQ) têm compactação mais moderna, mas são igualmente inadequados para arquivar sistemas de arquivos Unix (embora não haja nada que o impeça de usá-los apenas como compressores); O RAR também é proprietário.

Compressão:

Para uma compactação máxima, você pode dar uma olhada em um benchmark, como o enorme em http://mattmahoney.net/dc/text.html . Isso deve lhe dar uma idéia melhor das trocas envolvidas.

Você provavelmente não quer uma compressão máxima, no entanto. É muito caro.

xzé a ferramenta de compactação de uso geral mais popular nos sistemas Unix modernos. Eu acredito que o 7-zip também pode ler arquivos xz, pois eles estão intimamente relacionados.

Finalmente: se você estiver arquivando dados para algo que não seja armazenamento de curto prazo, escolha algo de código aberto e de preferência generalizado, para minimizar dores de cabeça posteriormente.


1

lzo, gz, b2, lzma (.lzma2 =.xz)são compressores de "fluxo": compactam um fluxo de bytes e não sabem e não se importam com arquivos, diretórios e metadados como permissões. Você precisa usar um arquivador como o tar para agrupar todos esses dados em um fluxo de bytes (um arquivo tar) e compactá-los com um compressor. Se você se interessa pelos dados de um único arquivo, também pode alimentar esse arquivo sozinho para um desses compressores.

Tar, cpio and paxsão arquivadores: eles pegam vários arquivos e diretórios e codificam os dados e metadados em um único arquivo. O alcatrão é o mais popular e o mais compatível, embora os méritos técnicos entre os três sejam mínimos o suficiente para que houvesse guerras religiosas sobre ele durante o início dos tempos.

7z e zip são compressores E arcihvers: Armazene todos os dados e metadados e os comprima. No entanto, AFAICT, nenhum deles salva permissões unix.

O Zip usa o mesmo algoritmo que o gzip chamado DEFLATE. 7z usa o algoritmo lzma

Para ler um único arquivo de um arquivo tar.gz ou similar, você precisará descomprimir todo o fluxo gz até que o arquivo tar seja exposto o suficiente para que você possa extraí-lo. O Zip permite compactar e retirar cada arquivo individualmente. 7z pode ter um ou outro comportamento.

Taxas e velocidades de compressão: gzip e lzo têm velocidades de compressão e descompressão muito muito rápidas, mas baixas taxas de compressão. Também não é preciso muita memória para compactar. O gzip é um pouco mais lento e oferece uma taxa de compactação um pouco melhor que o lzo.

É tão rápido que pode ser mais rápido ler um arquivo compactado gz ou lzo do disco e descompactá-lo rapidamente, em vez de ler o arquivo descompactado diretamente do disco.

O LZMA (xz) oferece excelente compactação em dados gerais, mas leva muito tempo para compactar e descompactar, além de levar uma quantidade significativa de memória para compactar.

O bz2 costumava ser o algoritmo de alta compactação preferido, mas desvalorizou, pois é mais lento que o lzma e leva mais tempo para compactar e descomprimir. No entanto, para certos tipos de dados (seqüências de DNA, arquivos com execuções muito grandes do mesmo byte, etc), o bzip2 pode superar todo o resto. Como exemplo, uma vez eu tive que compactar um arquivo de 1GB de 4GB e o b2 reduziu i para alguns 10s de kb, enquanto o lzma ocupou 10s de MBs, se bem me lembro.


Na verdade, o lzma é muito rápido em descomprimir.
Psusi 20/03/2014

0

Para arquivos especialmente grandes, você pode usar rzip. Primeiro, ele analisa dados redundantes em blocos grandes de 900 MB, os codifica e os transfere para o bzip2 (na verdade não, mas os mesmos algoritmos são usados).

Efeito? Muito mais rápido que xz, lzmaou bzip2, e, na minha experiência, sua taxa de compressão rivaliza com a de lzma. É um porco RAM, no entanto.

http://en.wikipedia.org/wiki/Rzip

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.