O módulo compression.zstd leva o formato Zstandard para a biblioteca padrão do Python e permite compactar dados com boa velocidade, alta taxa de compressão e suporte a processamento em fluxo. Ele é especialmente útil em backups, pipelines de dados, logs, caches, transferência de arquivos e qualquer cenário em que você precise reduzir tamanho sem aceitar o custo elevado de algoritmos mais lentos.
Neste guia, você vai aprender a compactar e descompactar bytes, trabalhar com arquivos grandes sem carregar tudo na memória, escolher níveis de compressão, usar dicionários e aplicar validações importantes. Antes de começar, vale revisar como o Python manipula caminhos com pathlib, como criar arquivos ZIP seguros, como ler arquivos gigantes sem travar e como copiar e mover arquivos com shutil.
O que é Zstandard
Zstandard, geralmente abreviado como Zstd, é um algoritmo de compressão sem perdas criado para equilibrar velocidade e redução de tamanho. Em muitos conjuntos de dados ele comprime melhor do que gzip em velocidades semelhantes ou superiores. O formato também aceita níveis de compressão, dicionários treinados e quadros independentes, recursos úteis para aplicações reais.
O módulo segue a especificação do formato e oferece uma API de alto nível para tarefas comuns. A documentação oficial do Python deve ser sua principal referência para detalhes de versão e assinaturas: compression.zstd na documentação do Python. A estrutura do formato está descrita na RFC 8878.
Compactação básica de bytes
Para dados pequenos, a forma mais simples é trabalhar diretamente com bytes. O fluxo básico consiste em codificar o texto, compactar o conteúdo e depois descompactá-lo.
from compression import zstd
texto = "Python e compressão Zstandard" * 100
dados = texto.encode("utf-8")
compactado = zstd.compress(dados)
restaurado = zstd.decompress(compactado)
print(len(dados), len(compactado))
print(restaurado.decode("utf-8") == texto)Esse padrão é adequado quando o conteúdo cabe confortavelmente na memória. Para arquivos grandes, usar uma função que recebe todo o conteúdo de uma vez pode duplicar ou triplicar o consumo de RAM durante a operação.
Escolhendo o nível de compressão
Níveis mais altos normalmente produzem arquivos menores, mas exigem mais CPU. O melhor nível depende do objetivo. Para respostas de API, caches temporários e dados enviados frequentemente, prefira níveis rápidos. Para backups gravados uma vez e lidos muitas vezes, níveis mais altos podem compensar.
compactado = zstd.compress(dados, level=6)Não escolha o nível apenas pelo tamanho final. Meça tempo de compressão, tempo de descompressão, memória e economia real no seu conjunto de dados. JSON repetitivo pode responder de forma diferente de imagens, vídeos ou arquivos já compactados.
Compactando arquivos em fluxo
O processamento em fluxo evita carregar o arquivo inteiro. A ideia é abrir a origem em modo binário, abrir o destino e copiar blocos através de um compressor.
from pathlib import Path
from compression import zstd
origem = Path("dados.jsonl")
destino = Path("dados.jsonl.zst")
with origem.open("rb") as entrada, destino.open("wb") as saida:
with zstd.open(saida, mode="wb", level=5) as compressor:
while bloco := entrada.read(1024 * 1024):
compressor.write(bloco)O bloco de um megabyte é apenas um ponto de partida. Blocos muito pequenos aumentam chamadas de função; blocos enormes elevam o uso de memória. Teste tamanhos como 64 KiB, 256 KiB e 1 MiB.
Descompactando com segurança
Dados compactados vindos de terceiros devem ser tratados como entrada não confiável. Um arquivo pequeno pode expandir para muitos gigabytes. Por isso, imponha limite de saída, grave em diretório controlado e não aceite nomes de arquivo arbitrários sem validação.
from pathlib import Path
from compression import zstd
entrada = Path("dados.jsonl.zst")
saida = Path("dados-restaurados.jsonl")
limite = 2 * 1024 * 1024 * 1024
escritos = 0
with zstd.open(entrada, mode="rb") as leitor, saida.open("wb") as destino:
while bloco := leitor.read(1024 * 1024):
escritos += len(bloco)
if escritos > limite:
raise ValueError("Saída descompactada excede o limite")
destino.write(bloco)Também valide espaço disponível em disco e remova o arquivo parcial quando ocorrer erro. Em serviços web, aplique timeout e limites por usuário.
Dicionários de compressão
Dicionários são úteis quando você compacta muitos objetos pequenos e semelhantes, como eventos JSON, mensagens de telemetria ou registros com o mesmo esquema. O dicionário aprende padrões recorrentes e pode melhorar bastante a taxa de compressão em conteúdos curtos.
O fluxo geral é reunir amostras representativas, treinar o dicionário, armazená-lo com versão e usá-lo tanto na compressão quanto na descompressão. O receptor precisa do mesmo dicionário. Portanto, inclua um identificador no protocolo ou no nome do arquivo e mantenha versões antigas enquanto ainda existirem dados dependentes delas.
Integridade e hashes
Compressão não substitui verificação de integridade. Para detectar corrupção ou troca acidental, calcule um hash como SHA-256 antes ou depois da compactação. Ao restaurar um backup, recalcule e compare.
import hashlib
def sha256_arquivo(caminho):
hash_obj = hashlib.sha256()
with open(caminho, "rb") as arquivo:
while bloco := arquivo.read(1024 * 1024):
hash_obj.update(bloco)
return hash_obj.hexdigest()Guarde o hash em um manifesto separado, junto com tamanho original, tamanho compactado, data, algoritmo e versão do dicionário.
Zstd, gzip ou ZIP?
Use Zstd quando velocidade e taxa de compressão forem prioridades e você controlar o ambiente de leitura. Use gzip quando compatibilidade universal for mais importante. Use ZIP quando precisar reunir vários arquivos, nomes, diretórios e metadados em um único contêiner. Também é possível combinar conceitos: empacotar vários arquivos em um tar e compactar o fluxo com Zstd.
Boas práticas em produção
Registre métricas de tamanho e duração, faça testes com dados reais, limite a saída descompactada e escreva primeiro em arquivo temporário. Depois de concluir e validar, renomeie de forma atômica. Isso impede que consumidores leiam um arquivo incompleto. Para tarefas recorrentes, use nomes previsíveis, retenção automática e alertas quando a taxa de compressão piorar inesperadamente.
Evite compactar novamente JPEG, MP4, ZIP ou outros formatos já comprimidos. O resultado costuma ser pouco ganho e mais CPU. Também não assuma que o maior nível será sempre melhor: em pipelines de alta vazão, um nível intermediário frequentemente entrega a melhor relação entre custo e economia.
Conclusão
compression.zstd oferece uma solução moderna para compactação sem perdas no Python. Comece com a API simples para bytes, migre para streams em arquivos grandes, defina limites para entradas externas e use dicionários quando houver muitos registros pequenos semelhantes. Com métricas, hashes e escrita atômica, o módulo se torna uma base sólida para backups, logs e pipelines eficientes.







