A surpreendente compactação com o XZ
Enviado por Henrique “LonelySpooky” Junior (henriquecsjΘgmail·com):
“Atire a primeira pedra aquele que nunca ignorou completamente um recurso fantástico em sua distribuição Linux favorita. Foi assim que, redondamente alheio e absolutamente por acaso, me deparei com o poderoso método de compressão XZ. Neste post faço uma rápida comparação entre os três métodos de compactação mais populares (GZip, BZip2 e Zip) com o XZ, um protocolo de compactação que não é novo, mas que é relativamente pouco usado.” [referência: lonelyspooky.com]
• Publicado por Augusto Campos em
2011-02-28
Eu pensava que os 3 métodos de compactação mais populares eram o Zip, RAR e 7z…
Li o post, e o arquivo de 400 megas que com xz virou apenas 700k, me parece mais um erro, na realidade.
De acordo com a Wikipedia e o próprio site do XZ, “with typical files, XZ Utils create 30% smaller output than gzip and 15% smaller output than bzip2″.
Se com o bzip e o gz os arquivos ficaram com 100 e poucos megas, me parece que tem algo de errado aí.
Claro que posso estar errado, mas foi o que me passou pela cabeça ao ler os textos. Se eu estiver errado, me desculpe o autor do post.
@Rael, também pensei a mesma coisa quando compactei os arquivos usando o XZ. “Deve ter alguma coisa errada”. Descompactei tudo e verifiquei a integridade. Realmente, foram quase 700 MB reduzidos a pouco mais que 700 KB.
Esta compactação me parece semelhante ao KGB.
Na prática, tenho obtido melhores resultados com 7z (usando o p7zip). Para quem não sabe, tanto o 7z quanto o xz usam o mesmo método de compactação, o LZMA. Mas o 7z ordena os arquivos por tipo na hora de compactar, assim arquivos com estrutura parecida ficam próximos, favorecendo a compactação. A dupla tar+xz não faz isso por padrão, apesar de ser possível criar um script para isso.
O 7z apenas não é adequado para backups de sistema inteiro, pois ele não guarda usuário/grupo nem atributos extendidos de arquivos. Entretanto, ele guarda o modo (permissões) dos arquivos, de forma que pode ser usado para distribuição de software, backup da home de um usuário, etc.
Já tem quase um ano que o archlinux utiliza XZ para compactar os pacotes. http://www.archlinux.org/news/switching-to-xz-compression-for-new-packages/
@Rael Gugelmin Cunha
A possibilidade de reduzir 700Mb a 700Kb depende do tipo do arquivo. Se essa compressão foi possível com o XZ, provavelmente será possível obter algo próximo disso com outros algoritmos como o RAR, BZIP, etc..
Utilizando 7-zip eu tenho conseguido compactar um único arquivo puramente texto (csv-like) de 2GB para pouco mais de 70MB.
Parece absurdo, mas funciona maravilhosamente bem.
@CarlosCaldas: no post, ele mostra que os outros formatos ficaram com 100 e poucos megas.
@LoonelySpooky: poxa, realmente impressionante então! Fica aí registrado que você compactou e descompactou pra testar. Valeu por responder :)
Conheço o xz, mas nunca soube de taxas de compactação de mais de 99%. Exemplo um diretório de documentos e alguns zip, com 60Mb fica em tar.bz2 com 39Mb e em tar.xz com 36Mb (O ganho normal do XZ). Acho que mesmo se fosse apenas texto ascii isso não é normal. Mistérios do Fedora…hehehe
Isso é igual a converter .mp3 para formatos desconhecidos, fica menor, legal, mas toca no mp3 player? no carro? [...]
E pelo menos no Windows aqui estou vendo que o winrar permite vários tipos de métodos de comprensão: armazenar, mais rápido, rápido, normal, bom, ótimo..
Parabéns!
LonelySpooky, você aguçou as idéias de alguns. Teste é teste. Se alguém não o aceita, que faça os próprios testes e conteste com os resultados obtidos.
Este XZ está na minha lista para avaliação.
No site de referência, alguém fala que hd é barato. Se você trabalha para empresa pública, não se tira um hd da cartola. O processo de compra não é trivial. Se trabalha para uma empresa séria, também não se tira um hd da cartola, tem que ter liberação da área competente para fazer a compra.
Aí é que entra uma ferramenta que pode te ajudar a ganhar ar para respirar até resolver o problema por completo.
Estes resultados variam bastante, conforme o tipo de arquivo a ser compactado e o algoritimo de compactação escolhido. Sempre que possível, o ideal é testar e ver o que melhor se adapta a cada caso.
O.O.
Eu agradeço por todos os comentários. Sei que o assunto é mesmo instigante porque todos nós temos de conviver com formatos compactados.
Dada a resposta positiva e a complexidade do assunto, vou preparar hoje uma segunda parte do artigo, com mais formatos (incluindo rar e 7zip) e, também, testes com formatos naturalmente compactados como mp3 e jpeg.
Talvez os dumps de mysql tivessem muitos 0s ou outro byte repetido? Teste rápido aqui com um arquivo de 700MB contendo apenas zeros:
$ dd if=/dev/zero of=test_file count=70 bs=10M
$ xz -kcz test_file > test_file.xz
$ ls -lh test_file*
…… 700M test_file
…… 105K test_file.xz
Carlos Felipe
“Isso é igual a converter .mp3 para formatos desconhecidos, fica menor, legal, mas toca no mp3 player? no carro?”
Qualquer um desses compactadores atuais descompactam xz/7z (no caso do Windows, 7-zip, gratuito, e winrar), essa desculpa não cola.
Já tem mais de quase 2 anos que o Slackware está usando o XZ ! com os nossos pacotes .txz os antigos .tgz !
uma coisa é compactar texto e obter taxas imensas. Outra é querer compactar formatos já compactados, como imagens ou filmes… kkkk
Fiz um teste com o XZ vs 7z:
– Arquivo .pst (Outlook) de 155MB
XZ – 31,0 MB
7z – 30,0 MB
bZ2 – 46,7 MB
Seria bom fazer testes compactando vários arquivos de tipos diferentes em um mesmo arquivo. Dessa forma teríamos algo mais real.
@Lucas De Marchi
Esse é o ponto!
O KGB archiver tinha esse mesmo “marketing” para ganhar na compactação: Pegue um arquivo cheio de zeros e compacte-o! você chegará a um resultado incrível! Claro né! A teoria de compactação funciona com uma matriz referenciando quantas vezes se repete algum caractere e qual a posição dele no arquivo, ou seja se aplicarmos isso a um arquivo que somente repete 1 caractere ele terá praticamente só o tamanho do cabeçalho de compactação. Da mesma forma, se voce pegar um arquivo já compactado (vale também para arquivos de video divx por exemplo), ele diminuirá muito pouco ou até aumentará!
Concluindo, não existe milagre em compactação. Depende mais do arquivo que está sendo compactado do que do método.
Peguei um arquivo de 3.3Gb, uma imagem de uma máquina virtual de Windows XP, no virtualbox.
Gzip -9 = 1.3Gb
Bzip2 –best = 1.3Gb
7zip m0=lzma -mx=9 -mfb=64 -md=32m -ms=on 925Mb
xz -9 = 892Gb
Na prática, tenho obtido melhores resultados com 7z (usando o p7zip) [2]
@Carlos Felipe:
Bem… Aparelhos de carro, media centers, etc. não mexem com esse tipo de compactação de arquivos (não adianta pegar um arquivo em MP3 e compactá-lo em outro formato (como ZIP, RAR, 7Z…). O aparelho não lerá o arquivo. Também, não creio que seja tão vantajoso assim compactar arquivos MP3 (pelas minhas experiências pessoais, quase não há ganho de espaço).
Lambro-me, quando comecei a mexer com Informática, que ficava usando o DoubleSpace no MS-DOS (com ele, conseguia pegar um HD com 420 MB e fazê-lo ficar com 810 MB). Recentemente, o Btrfs trouxe a possibilidade de compactar o sistema de arquivos no Linux.
Alguém aí está medindo o tempo gasto nesses testes? O tempo é muito importante para mim. Gosto do Gzip porque é o mais rápido de todos. O zip também é rápido e mais difundido por aí (por causa do Windows). Pra mim não adianta compactar mais compactado e me fazer esperar mais tempo para compactar e descompactar.
Taxas altas de compactação são importantes para quem distribui software. A diferença de cada arquivo individual é uma merreca, mas essa merreca faz diferença no consumo de um site que distribui software para milhares de pessoas. Provavelmente foi por isso que o Slackware adotou o XZ.
Para mim, no desktop, só compensa se for rápido. Por isso que eu nunca adotei RAR nem Bzip.
Noto nos comentários algumas críticas e comparações que não fazem sentido. A primeira é comparar um tipo de programa (compressor de streams) com outro (compressor e compactador de uso geral com arquivador), ou, em outras palavras, comparar xz, gzip, bzip2 com 7zip, rar, arj.
Os primeiros são feitos tão-somente para, tendo uma quantidade de bytes, comprimi-lo, e quando têm que ser usados para propósito geral são geralmente conjugados com um arquivador como o tar. Por exemplo:
tar -Jcf arquivo.tar.xz arquivo1 arquivo2 diretório ...
que é equivalente a:
tar cf - arquivo1 arquivo2 diretório ... | xz -c - > arquivo.tar.xz
Primeiro o tar ‘arquiva’ (sem comprimir), com atributos, datas, etc. todos os arquivos numa corrente de bytes, que o xz então trata de receber pela entrada-padrão e comprimir gerando o arquivo.tar.xz.
A separação de tarefas (compressor e arquivador), apesar de gerar estranheza para quem vem do mundo Windows e não está acostumado a sufixos duplos (.tar.gz, .tar.xz, .cpio.bz2 etc.) permite muito mais flexibilidade e eficiência como ao, por exemplo, possibilitar comprimir o resultado de comandos executados remotamente (ssh).
Por isso a outra “crítica” sem sentido foi que o xz não armazena atributos. Esse nunca foi o objetivo dele.
Por último, lembro a quem gosta de usar os termos corretos em computação que esses programas não são “compactadores”. São compressores, embora provavelmente também usem estratégias de colocar os dados de forma compacta em sua estrutura interna. Na faculdade, já perdi ponto em prova por confundir um termo com o outro…
Patola, segundo a Wikipedia, o XZ “assim como gzip e bzip2, suporta concanetação de vários arquivos comprimidos, mas a convenção é não empacotar mais que um arquivo por vez” (tradução bem porca minha).
Sim, Rael, mas o ponto principal é que ele não foi planejado para isso. Quando você o usa como se fosse um arj, rar ou coisa que o valha, você o está usando de maneira errada, quase que como usar um alicate pra pôr um prego – funciona mas não é o melhor.
@Patola, admiro e respeito seus comentários, sempre embasados e bem redigidos, mas não posso deixar passar essa.
Não é questão direta a vc, somente a esta definição de compactar/comprimir que, por vezes, vem se arrastando e se difundindo mais e mais. Como dito por vc mesmo, vindo de um professor já.
Em suma, compactar e comprimir são sinônimos como sabemos. O que tem havido, por parte de alguns, é a tentativa de pseudo intelectualizar – entenda codificar, complicar – o conhecimento. Fato que é comum em diversas áreas (matemática, alguém?), sobretudo em se tratando de alguns termos simples (a citar o latim em obras juduciais), que poderiam ser facilmente compreendidos, a fim de tornar complexa a “arte” de seu saber. :)
O que citam, normalmente, como diferente – no caso, a “compactação” como vc mesmo disse – é na verdade um mero processo de ordenação de dados. Onde, por vezes ordena-se espaço vazio em sequencia ao espaço não vazio, podendo haver variantes. Onde, também, sempre citam o processo de desfragmentação de disco como exemplo.
Então, por fim, compactar e comprimir ainda constam como no dicionário. Ou seja, tudo a lesma lerda.
Não foi um comentário pessoal, apenas uma tentativa de esclarecimento geral.
Pra que complicar quando se pode simplificar? :)
@Marcos Vinicius
Concordo em gênero, número e grau!
E no caso de você perder ponto na faculdade, com certeza seu professor é um dinossauro da computação que quer que a computação fique reservada a nichos de nerds e afins.
Trabalho para um consórcio de universidades do estado do RJ e tanto na computação como na informática básica, o consenso é trazer o aluno para a disciplina, e não afastá-lo mais de coisas práticas, por conta simplesmente de uma convenção.
Isso é explicado pois a maior evasão de alunos é no primeiro/segundo período, onde se ensina Teoria da computação, Organização de Computadores, etc, etc. O aluno desiste pensando que Computação se resume a conceitos e teorias, que na prática se mostram bem diferentes. E assim se perdiam possiveis e brilhantes desenvolvedores, designers, analistas de rede, etc. Ainda bem que isso está mudando!
@vxdzero
“Isso é explicado pois a maior evasão de alunos é no primeiro/segundo período, onde se ensina Teoria da computação, Organização de Computadores, etc, etc. O aluno desiste pensando que Computação se resume a conceitos e teorias, que na prática se mostram bem diferentes. E assim se perdiam possiveis e brilhantes desenvolvedores, designers, analistas de rede, etc. Ainda bem que isso está mudando!”
Humm.. se alguém faz computação na esperança de se tornar designer, o que essa pessoa precisa é de orientação. Existe faculdade de Design, provavelmente alguma no teu consórcio. Se fizermos uma pesquisa nos cursos de matemática, física, química, ou outro que você escolher, provavelmente descobriremos que a evasão se dá quando as matérias mais complexas começam a aparecer. Nem por isso, espero, estão optando por tomar o atalho de ensinar menos em troca de graduar mais.
Deixo com você a palavra de um “dinossauro”..
“Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas.”
As ferramentas, como sabemos, vão e vêm. Se tornam obsoletas, são substituídas, descartadas, por vezes inúteis. As contribuições do senhor que disse as palavras acima para o que você chama de “computação” são atemporais.
@Patola, concordo.
Não sei o formato do tal dump. Mas por exemplo, se inclui comando completo, então todas as linhas (referentes a comandos DML) vão ter
“INSERT INTO (, …) VALUES (, , …);”
Só variando os valores. Isso permite uma compactação realmente absurda devido a repetição.
Aliás, seria interessante em futuros artigos detalhar o tamanho de dicionários usados. Claro, melhor comparar as opções default. Mas pode valer a pena forçar os concorrentes para ver até onde chegam.
Já vi um arquivo ISO compactado pelo 7z ficar com menos de 2% do tamanho original (não lembro os tamanhos exatos). Não tenho mais este arquivo, mas era um ISO do jogo Zanac X Zanac.
O pacote mandriva 2010.2 é: xz – 4.999.9beta-2mdv2010.1
Site Oficial (http://tukaani.org/lzma/)
xz – XZ Utilidades
XZ oferece taxa de compressão muito alta e descompressão rápida. O núcleo do utils XZ é Igor Pavlov LZMA SDK contém o codificador LZMA reais / decodificador. utils LZMA adicionar alguns scripts que fornecem interface de linha de comando como o gzip e um par de XZ outras ferramentas relacionadas. Também dispõe:
- Média da taxa de compressão de 30% melhor do que o gzip e 15% melhor do que o bzip2.
- Velocidade de descompressão é apenas pouco mais lento do que o gzip, sendo 2-5 vezes mais rápido que o bzip2.
- No modo rápido, mais rápido que o bzip2 comprime com uma taxa de compressão comparável.
- Alcançar as melhores relações de compressão leva de quatro a até doze vezes mais do que com bzip2. No entanto. Isso não afeta a velocidade descomprimir.
- Muito interface de linha de comando semelhante do que o gzip e bzip2 tem.
Sobre o tópico compressão x compactação… Bom, sinto se incomoda ao público, mas o que é “sinônimo” é somente o uso, porque tecnicamente eles foram definidos como coisas diferentes. E é uma definição que tem motivo de ser, não confundir técnicas diferentes, do mesmo modo que damos o nome de tango e balé para modos diferentes de dançar.
Discordo totalmente da idéia de que isso “dificulta” ou “elitiza” as coisas para o leigo. Pelo contrário, esclarece mais e não é difícil trocar o uso de “compactação” por “compressão”. Acho que esse ponto de vista de “usuário é retardado” subestima demais a capacidade das pessoas de pensar e aprender.
E por fim, só é “compactação” no português, em inglês quase sempre o termo corrente (e correto) pra isso é “compress” (comprimir) ou “pack” (empacotar). Compactar seria “to compact”, que quase nunca vi sendo usado. E criar um cisma de termos técnicos é que leva a confusões, não uniformizá-lo.
Acho a situação do termo “compactar” problemática como a do termo “teoria”, que em filosofia da ciência tem um significado (o corpo explicativo de um conjunto de fatos) e na voz popular tem outro (o de “hipótese” ou “especulação”). O ideal não é adequar o termo técnico ao popular e sim o contrário.