Qual é a diferença entre diferentes sistemas de “compressão”?

7

Sempre usei TAR e ZIP para compactação, mas recentemente ouvi sobre o algoritmo de compactação *.Z . Isso trouxe uma pergunta para mim:

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

Executando alguns testes, descobri que tar , como descobri, NÃO é realmente compactado (a menos que explicitamente especificado). Significado, o que é bom em comparação com outros métodos de compressão?

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

Resumo da postagem:

  1. Devo usar *.tar , *.Z , *.7z , .tar ou .tar.<insert ending here> para a melhor compactação?
  2. Se o% normal co_de% não for compactado, por que o usamos?

EDIT: Nem todos os algoritmos permitem o armazenamento de 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?

    
por Kaz Wolfe 20.03.2014 / 04:17

5 respostas

16

tar significa arquivo de fita. Tudo o que ele faz são arquivos de pacote 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 é um assunto totalmente separado que você costumava ter para canalizar a saída por meio de um utilitário externo para compactar se quisesse isso. O GNU tar foi legal o suficiente para adicionar switches para que ele filtrasse automaticamente a saída através do utilitário apropriado como um atalho.

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

O lzma (aka. * .xz) tem uma das melhores taxas de compactação e é bastante rápido na descompressão, tornando-se uma ótima escolha atualmente. No entanto, requer uma tonelada de tempo de ram e cpu para comprimir. O venerável gzip é um pouco mais rápido na compactação, então pode ser usado se você não quiser dedicar tanto tempo de CPU. Ele também tem uma variante ainda mais rápida chamada lzop. bzip2 ainda é bastante popular, já que substituiu o gzip por um tempo antes que o 7zip / lzma aparecesse, já que obteve melhores taxas de compactação, mas está caindo em desuso nos dias de hoje, já que 7z / lzma é mais rápido na descompactação e obtém melhores taxas de compactação . O utilitário compress , que normalmente nomeia os arquivos * .Z, é antigo e há muito esquecido.

Uma das outras diferenças importantes entre o zip e o tar é que o zip comprime os dados em pequenos pedaços, ao passo que quando você compacta um arquivo tar, você comprime tudo de uma só vez. O último oferece 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 único arquivo ou dois de um arquivo grande. 7z e dar permitem que você escolha compactar a coisa toda (chamada modo "sólido") ou pequenos pedaços para facilitar a extração por partes.

    
por psusi 20.03.2014 / 04:37
9

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

Agora em tar , como você disse, tar não é e nunca foi um programa de compactação. Em vez disso, é um arquivador ; Seu principal objetivo é criar um arquivo grande com muitos arquivos 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 em 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ê executar fora de inodes, você não pode mais criar novos arquivos. Simplificando, a mesma quantidade de dados armazenados como milhares de arquivos ocupará mais do seu disco rígido do que esses mesmos arquivos em um único arquivo TAR.

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

Inode count:              393216
Free inodes:              171421

Se eu continuar a 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

Sem 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, criar algumas centenas de milhares de arquivos vazios rapidamente esvazia meus inodes e não posso mais criar novos inodes. Se eu fosse tar , eu poderia 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 ligo meus diretórios de trabalho antigos quando um projeto é concluído, já que quanto menos arquivos eu tenho, mais rápido programas como find irão funcionar.

Existe uma grande resposta no Superusuário que entra em mais detalhes, mas além do acima, o outras razões básicas pelas quais tar ainda é popular hoje em dia são:

  1. Eficiência: usar tar para canalizar por meio de um programa de compactação como gzip é mais eficiente, pois evita a criação de arquivos intermediários.

  2. tar vem com todos os tipos de recursos que foram projetados ao longo de sua longa história, o que o torna particularmente útil para backups * nix (pense em permissões, propriedade de arquivo, capacidade de direcionar dados diretamente para STDOUT e através de um link SSH ...)

  3. Inércia. Estamos acostumados a tar . É seguro assumir que estará disponível em qualquer * nix que você possa usar, o que o torna muito portátil e prático 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:)

    
por terdon 20.03.2014 / 04:40
4

Existem duas tarefas distintas, mas relacionadas. Embalando uma árvore de arquivos (incluindo nomes de arquivos, estrutura de diretórios, permissões do sistema de arquivos, propriedade e quaisquer outros metadados) em um fluxo de bytes é chamado arquivamento . Removendo a redundância em um fluxo de bytes para produzir um Um fluxo de bytes menor é chamado de compressão .

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

(o gzip e outros programas que imitam a interface do gzip freqüentemente opção para armazenar o nome do arquivo original na saída compactada, mas isso, juntamente com um CRC ou outra verificação para detectar a corrupção, é o somente metadados que eles podem armazenar.)

Existem vantagens em separar a compactação do arquivamento. O arquivamento é específico da plataforma (os metadados do sistema de arquivos preservar varia muito), mas a implementação é simples, em grande parte com E / S, e muda pouco ao longo do tempo. A compactação é independente de plataforma, mas as implementações são limitadas pela CPU e algoritmos estão melhorando constantemente para tirar proveito do recursos aumentados que o hardware moderno pode trazer para o problema.

O mais popular arquivador do Unix é tar , embora existam outros como cpio e ar . (Pacotes Debian são ar archives, enquanto cpio é frequentemente usado para discos ramiais iniciais.) tar é ou tem sido frequentemente combinado com ferramentas de compactação como compress (.Z), gzip (.gz), bzip2 (.bz2) e xz (.xz), do mais antigo para o mais novo, e não coincidentemente da pior para a melhor compressão.

Criar um arquivo tar e compactá-lo são etapas distintas: o compressor não sabe nada sobre o formato de arquivo tar . Isso significa que extrair um único arquivo de um% compactado co_de% archive requer descompactando todos os arquivos anteriores. Isso é freqüentemente chamado de arquivo "sólido".

Igualmente, já que o tar é um formato de "streaming" - necessário para que seja útil em um pipeline - não há nenhum índice global em um arquivo tar e listando O conteúdo de um arquivo tar é tão caro quanto extraí-lo.

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

Existe polinização cruzada entre as diferentes plataformas e filosofias: tar é essencialmente compressor de gzip sem sua arquivador, e zip é essencialmente xz do compressor sem o seu arquivador.

Existem outros compressores especializados. Variantes do PPM e suas sucessor 7-zip são otimizados para compactação máxima sem considerar consumo de recursos. Eles podem facilmente mastigar tanto CPU e RAM quanto você pode jogá-los, e a descompressão é tão desgastante quanto compressão (para contraste, as ferramentas de compressão mais utilizadas são assimétrica : a descompressão é mais barata que a compressão).

No outro extremo do espectro, ZPAQ , lzo e snappy são "light" compressores projetados para velocidade máxima e recurso mínimo consumo, ao custo da compressão. Eles são amplamente usados dentro 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 de LZ4 para arquivamento, a menos que você esteja tentando criar arquivos facilmente legível em outro lugar.

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

Compressão:

Para a compactação máxima, você pode dar uma olhada em um benchmark, como o um enorme no link . Isso deve dar você tem uma idéia melhor das compensações envolvidas.

Você provavelmente não deseja a compactação máxima. É também caro.

zip é a ferramenta de compactação de uso geral mais popular no moderno Unix sistemas. Eu acredito que o 7-zip pode ler arquivos xz também, já que eles estão próximos relacionados.

Finalmente: se você estiver arquivando dados para algo que não seja de curto prazo armazenamento você deve escolher algo de código aberto e de preferência difundido, para minimizar as dores de cabeça mais tarde.

    
por hexwab 20.03.2014 / 15:23
1

lzo, gz, b2, lzma (.lzma2 =.xz) são compressores "stream": eles compactam um fluxo de byes e não se importam com arquivos, diretórios e metadados como permissões. Você tem que usar um arquivador como tar para agrupar todos os dados em um fluxo de bytes (um arquivo tar) e comprimir isso com um compressor. Se forem os dados de um único arquivo de seu interesse, você também pode alimentar esse arquivo sozinho para um desses compressores.

Tar, cpio and pax sã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 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 a aurora dos tempos.

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

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

para ler um único arquivo de um tar.gz ou algo parecido, você precisará descompactar todo o fluxo gz até que o suficiente do arquivo tar seja exposto para que você possa extraí-lo. O Zip permite que você comprima e extraia cada arquivo individualmente. 7z pode ter qualquer comportamento.

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

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

O LZMA (xz) fornece excelente compactação em dados gerais, mas demora muito para compactar e descompactar, além de levar quantidades significativas de memória para compactar.

O bz2 costumava ser o algoritmo de alta compressão de escolha, mas caiu em desuso, já que é mais lento que o lzma e leva mais tempo para compactar e descompactar. No entanto, para certos tipos de dados (sequências de dna, arquivos com execuções muito grandes do mesmo byte, etc.), o bzip2 pode bater todo o resto. Como exemplo, uma vez eu tive que comprimir um arquivo de 4GB de 1's e b2 reduzido i para alguns 10's de kb enquanto o lzma levou uns 10's de MBs se bem me lembro.

    
por staticd 20.03.2014 / 06:36
0

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

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

link

    
por user258532 19.05.2014 / 13:11