Open Source

Bzip3 renova compressão de código e supera LZMA e Zstandard

Criado por Kamila Szewczyk, o compressor bzip3 usa BWT e context mixing para reduzir arquivos de código-fonte a uma fração do tamanho original.

Compartilhar
Servidores em data center moderno com luzes azuis e cabeamento de rede organizado
Servidores em data center moderno com luzes azuis e cabeamento de rede organizado

A desenvolvedora Kamila Szewczyk apresentou publicamente o bzip3, projeto open source desenhado para atuar como o sucessor espiritual do tradicional BZip2. Hospedada no repositório de código aberto mantido sob o identificador iczelia/bzip3 no GitHub, a ferramenta foi projetada com foco explícito no processamento de textos e bases de código-fonte, aplicando uma cadeia algorítmica moderna que combina compressão de alta densidade e aceleração paralela para desafiar ferramentas consolidadas da infraestrutura global de software, como o xz e o zstd.

Servidores em data center moderno com luzes azuis e cabeamento de rede organizado
Foto: Hacker News

Diferente de empacotadores genéricos voltados a fluxos multimídia ou blobs binários arbitrários, o bzip3 direciona suas otimizações para a redundância estrutural intrínseca a linguagens de programação e documentos tipados. Em testes comparativos publicados na documentação oficial com o histórico completo de lançamentos da linguagem Perl 5, a ferramenta de Kamila Szewczyk superou algoritmos consolidados da indústria, reduzindo o volume final dos dados brutos a uma fração expressiva do tamanho obtido pelo LZMA (utilizado no utilitário xz) e pelo Zstandard da Meta, estabelecendo uma nova referência no ecossistema de arquivamento técnico.

O projeto marca uma evolução geracional em relação ao utilitário bzip2 clássico mantido pela comunidade Unix há décadas. Enquanto o compressor original baseava seu pipeline na transformada de Burrows-Wheeler combinada com codificação de Huffman clássica, o bzip3 reformula completamente cada estágio do pipeline matemático, incorporando aceleradores de sufixos de última geração e esquemas probabilísticos de modelagem de contexto que eliminam gargalos históricos de taxa de compressão e tempo de descompressão em discos rígidos convencionais como a linha WD Blue HDD.

Arquitetura e mecânica dos algoritmos

A espinha dorsal técnica do bzip3 consiste em três componentes algorítmicos integrados: um codificador entrópico de mistura de contexto de ordem zero (order-0 context mixing entropy coder), uma transformada de Burrows-Wheeler (BWT) rápida baseada em arranjos de sufixos (suffix arrays) e uma etapa preliminar de RLE com LZP (Lempel-Ziv + predição). Este último mecanismo combina o casamento de cadeias no estilo LZ77 com a modelagem de contexto probabilística derivada do modelo PPM (Prediction by Partial Matching), preparando os dados textuais antes da transformação estrutural.

Para viabilizar a implementação de alta velocidade da transformada BWT, Kamila Szewczyk utilizou a biblioteca libsais, de autoria do engenheiro Ilya Grebnov. A libsais viabiliza a construção acelerada do vetor de sufixos diretamente na memória, servindo também como implementação de referência para os ajustes no codificador preditivo LZP interno. Além do trabalho de Grebnov, a ferramenta incorpora um pós-codificador de transformada Burrows-Wheeler em domínio público concebido pelo pesquisador Ilya Muravyov, cuja derivação foi integrada ao código do bzip3 para refinar o estágio final de entropia.

A distribuição das responsabilidades matemáticas no bzip3 permite processar estruturas repetitivas de código com menor perda de entropia residual. Enquanto implementações clássicas do bzip2 sofrem com blocos rígidos e esquemas estáticos que desperdiçam contexto semântico além dos limites locais de 900 KB, o bzip3 suporta blocos massivos parametrizáveis via linha de comando, permitindo estender o campo de captura de repetições em projetos de grande escala para dezenas ou centenas de megabytes por bloco processado.

Resultados no benchmark do Perl

Para comprovar o desempenho em dados de desenvolvimento real, a documentação oficial documentou uma metodologia de teste exaustiva sobre todo o histórico de distribuição da linguagem Perl 5. O processo iniciou com a extração automatizada via utilitário wget de todas as versões disponibilizadas no repositório CPAN (Comprehensive Perl Archive Network) através do endpoint público https://www.cpan.org/src/5.0/, seguido pela descompressão sequencial via gunzip de 262 arquivos compactados originais.

Os 262 arquivos descompactados foram agrupados em um único arquivo mestre denominado all.tar. Esse repositório bruto consolidado foi submetido a baterias de compressão comparativa sob monitoramento de métricas de temporização (tempo de usuário, sistema e total de relógio), consumo máximo de memória RAM e percentual de ocupação de CPU entre o xz (algoritmo LZMA), o clássico bzip2, o Zstandard (zstd) e diferentes parametrizações do novo bzip3.

O comando de referência executado para o utilitário moderno da comunidade GNU foi xz -T16 -9 -k all.tar, que exigiu 10.829,91 segundos de tempo de usuário, 26,91 segundos de sistema, atingiu 1488% de uso de CPU com alocação de 14.658 MB de memória RAM e concluiu a tarefa em 12 minutos e 09,24 segundos totais. O arquivo compactado gerado pelo LZMA atingiu a marca de 2.056.645.240 bytes.

Em contrapartida, o histórico bzip2 -9 -k all.tar operou praticamente em thread única, consumindo escassos 8 MB de memória e 95% de CPU, demandando 981,78 segundos de usuário, 9,77 segundos de sistema e 17 minutos e 16,64 segundos de relógio total. Contudo, a taxa de compressão do veterano foi a mais fraca do teste, gerando um pacote de saída de 3.441.163.911 bytes, revelando as limitações dos algoritmos do final dos anos 1990.

O utilitário corporativo da Meta foi avaliado através da instrução zstd -T12 -16 all.tar, que encerrou seu processamento em 6 minutos e 35,62 segundos totais, consumindo 687 MB de memória e operando a 1056% de carga de processamento com 4.162,94 segundos de tempo de usuário e 16,40 segundos de sistema. Apesar da velocidade ágil no pipeline multithread, o tamanho final gerado pelo Zstandard foi de 3.076.143.660 bytes, bastante distante da eficiência demonstrada pelas variantes do novo compressor.

Variações de parâmetros no bzip3

A ferramenta de Kamila Szewczyk foi submetida a dois testes centrais com diferentes parâmetros de tamanho de bloco e controle de threads no arquivo all.tar. O primeiro comando empregou a sintaxe bzip3 -e -b 256 -j 12 all.tar, indicando blocos de 256 MiB executados com 12 threads simultâneas. O processo durou 7 minutos e 10,10 segundos totais (com 2.713,81 segundos de tempo de usuário, 16,28 segundos de sistema, 634% de CPU e 18.301 MB de memória), resultando em um arquivo comprimido de apenas 1.001.957.587 bytes, praticamente metade do volume do LZMA.

Em seguida, foi testada a configuração de compressão extrema através do parâmetro bzip3 -e -b 511 -j 4 all.tar, utilizando blocos de 511 MiB e alocação de 4 threads simultâneas. A execução consumiu 12.178 MB de memória RAM, 17,65 segundos de tempo de usuário, 12,19 segundos de sistema, 170% de CPU e totalizou 7 minutos e 08,65 segundos de relógio. O arquivo de saída despencou para impressionantes 546.456.978 bytes, superando com larga folga todas as ferramentas concorrentes e ocupando quase um quarto do espaço exigido pelo xz.

O desempenho em descompressão medido fisicamente em uma unidade de disco rígido magnético convencional WD Blue HDD demonstrou equilíbrio competitivo favorável ao software. O utilitário bzip3 em modo paralelo completou a restauração completa em 4 minutos e 06 segundos, superando com folga o LZMA do xz, que levou 4 minutos e 40 segundos, e esmagando o tempo do clássico bzip2, que exigiu 9 minutos e 22 segundos. A liderança nessa métrica de leitura mecânica permaneceu com o Zstandard, que concluiu o trabalho em 3 minutos e 51 segundos.

Integração com deduplicação de longo alcance

Além dos testes com compactadores puros e autocontidos, a documentação expõe experimentos com técnicas de deduplicação de longo alcance por meio do utilitário lrzip. Na primeira fase, o arquivo agregado original all.tar passou por deduplicação sem aplicação de codificador secundário com o comando time lrzip -n -o all_none.tar.lrz all.tar, levando 11 minutos e 28,00 segundos (com 546,17 segundos de usuário, 160,87 segundos de sistema, 102% de CPU e 10.970 MB de RAM) para isolar blocos idênticos no histórico das versões de Perl 5.

Para comparar a integração com outros motores, o lrzip foi executado em conjunto com compactadores internos consolidados. A combinação nativa com o LZMA, invocada sob a linha time lrzip --lzma -o all_lzma.tar.lrz all.tar, levou 11 minutos e 44,83 segundos com 10.792 MB de RAM, gerando um volume compactado de 64.774.202 bytes. Já a combinação clássica time lrzip -b -o all_bzip2.tar.lrz all.tar consumiu 10 minutos e 34,10 segundos com 10.970 MB de memória, finalizando o pacote em 75.685.065 bytes.

O ápice da densidade ocorreu quando o arquivo puramente deduplicado pelo lrzip (nomeado como all_none.tar.lrz) foi processado pelo motor do bzip3 usando a instrução time bzip3 -e -b 256 -j 2 all_none.tar.lrz. A operação foi concluída em apenas 22,411 segundos totais (utilizando 32,05 segundos de CPU de usuário, 0,76 segundos de sistema, 146% de carga e 2.751 MB de memória). O resultado final alcançou a marca recorde de 60.672.608 bytes, estabelecendo a combinação lrzip + bzip3 como a mais eficiente de todo o levantamento comparativo.

Para análises complementares em corpora adicionais e confrontos contra arquiteturas como Turbo-Range-Coder e a ferramenta BSC, a autora aponta os testes de benchmark conduzidos pelo desenvolvedor e mantenedor conhecido no meio de compactação como powturbo, além de relatórios internos mantidos no caminho etc/BENCHMARKS.md do próprio repositório oficial.

Desempenho e compatibilidade de hardware

A taxa de transferência em tempo de execução do bzip3 apresenta alta sensibilidade ao compilador empregado na geração do binário executável e da biblioteca libbz3. De acordo com as notas técnicas fornecidas pelo projeto, compilações realizadas em ambiente Linux de 64 bits (x64 Linux) utilizando o compilador clang13 atingem tipicamente marcas de até 17 MiB/s em compressão e 23 MiB/s em descompressão por thread individual de processamento. O texto ressalta expressamente que sistemas operacionais Windows e compilações de 32 bits tendem a apresentar velocidades consideravelmente inferiores.

Apesar dessa variação em ecossistemas legados ou proprietários, a compatibilidade de arquitetura da base de código foi amplamente validada por Kamila Szewczyk em uma diversificada matriz de hardware. Os testes de compilação e execução corretos foram formalmente atestados em plataformas x86, x86_64, armv6, armv7, aarch64, ppc64le, mips, mips64, sparc e no ecossistema de mainframes corporativos s390x da IBM.

Essa abrangência de suporte arquitetural garante que a ferramenta possa ser incorporada desde dispositivos embarcados de baixa potência baseados em processadores ARM antigos até ambientes de computação corporativa pesada de servidores POWER e IBM Z, permitindo padronizar formatos de empacotamento de código e repositórios remotos sem isolar nichos legados de computação corporativa e acadêmica.

Compilação e ecossistema de licenças

O processo de instalação do utilitário foi estruturado em conformidade com os padrões clássicos da infraestrutura de sistemas operacionais Unix-like. Para instalações originadas diretamente da clonagem de repositório Git, o usuário deve acionar o script inicial ./bootstrap.sh, seguido pelo ciclo tradicional composto pelos comandos ./configure, make e a instalação com privilégios de superusuário via sudo make install. Em ambientes macOS, o empacotador de pacotes Homebrew foi habilitado diretamente com suporte à instalação pelo comando trivial brew install bzip3.

A flexibilidade do pipeline de automação e compilação do software é creditada diretamente ao desenvolvedor Caleb Maclennan, responsável por configurar o ecossistema autotools como um sistema de construção amigável para mantenedores de pacotes de distribuições de software. A ferramenta também incorpora o utilitário derivado de busca textual bz3grep, com direitos autorais datados de 2003 creditados a Thomas Klausner sob os termos da permissiva licença BSD-2-clause.

Do ponto de vista de conformidade jurídica, a totalidade da base de código do bzip3 está sob direitos autorais de Kamila Szewczyk cobrindo o período de 2022-2023 (sob o endereço de contato k@iczelia.net) e é distribuída estritamente sob os termos da licença LGPLv3 (GNU Lesser General Public License versão 3). O texto esclarece formalmente que o produto como um todo não opera sob licenciamento dual, rejeitando sobreposições entre a licença LGPLv3 e permissões Apache.

No entanto, submódulos individuais do projeto carregam licenças específicas integradas: o núcleo da transformada Burrows-Wheeler contido na libsais e o código de predição LZP são licenciados sob a Apache 2.0, com direitos registrados para Ilya Grebnov (ilya.grebnov@gmail.com) nos anos de 2021-2022. A pasta de ferramentas de compilação build-aux incorpora contribuições sob a licença GPL-3+ com exceção de AutoConf de autoria de Daniel Richard G (2011), Marc Stevens (2019) e Steven G. Johnson (2008). Scripts auxiliares como ax_check_compile_flag.m4 (assinado por Guido U. Draheim em 2008 e Maarten Bosmans em 2011) utilizam a licença FSFAP, enquanto o utilitário git-version-gen mantém direitos da Free Software Foundation sob a GPLv3.

Alertas de integridade de dados

Apesar dos números de benchmark expressivos contra padrões da indústria como LZMA e Zstandard, Kamila Szewczyk fez questão de publicar uma seção explícita e intransigente de termos de isenção de responsabilidade técnica (disclaimers) diretamente na documentação primária do repositório, destacando as limitações teóricas do manuseio de dados com algoritmos altamente complexos:

I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE USE OF THIS PROGRAM/LIBRARY, HOWSOEVER CAUSED. Every compression of a file implies an assumption that the compressed file can be decompressed to reproduce the original. Great efforts in design, coding and testing have been made to ensure that this program works correctly.

A justificativa para a postura rigorosa de ressalva decorre da natureza inerente aos esquemas de codificação contextual e ordenação de blocos em larga escala. A autora enfatiza que a sofisticação da implementação envolve condições de contorno estatísticas que tornam impossível a garantia matemática absoluta contra eventuais defeitos de descompressão em cenários não previstos:

However, the complexity of the algorithms, and, in particular, the presence of various special cases in the code which occur with very low but non-zero probability make it impossible to rule out the possibility of bugs remaining in the program. DO NOT COMPRESS ANY DATA WITH THIS PROGRAM UNLESS YOU ARE PREPARED TO ACCEPT THE POSSIBILITY, HOWEVER SMALL, THAT THE DATA WILL NOT BE RECOVERABLE.

Para equilibrar o tom do alerta e contextualizar a qualidade da implementação perante a comunidade técnica internacional, Szewczyk acrescenta que o aviso não significa fragilidade estrutural do software. A autora aponta que a biblioteca de baixo nível libbz3 foi meticulosamente desenhada e testada de modo extensivo antes da disponibilização pública:

That is not to say this program is inherently unreliable. Indeed, I very much hope the opposite is true. Bzip3/libbz3 has been carefully constructed and extensively tested.

Os números consolidados no teste do arquivo all.tar e a versatilidade de integração com o sistema de deduplicação lrzip consolidam o bzip3 como uma das arquiteturas contemporâneas mais eficientes no nicho de armazenamento de bases de código legadas e grandes repositórios git. À medida que equipes de desenvolvimento buscam otimizar custos com armazenamento frio e tráfego de dados estruturados em nuvem, o projeto de Kamila Szewczyk reacende o protagonismo da família bzip na vanguarda da engenharia de software.

#bzip3#compressao#bzip2#open source#lzma
Compartilhar

Artigos Relacionados