compression.zstd: compacte dados com Zstandard

Publicado em: 18/09/2026
Tempo de leitura: 5 minutos
Código e estrutura de arquivos para compressão Zstandard no Python

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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Programador gerenciando uma fila assíncrona com asyncio.Queue.shutdown
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    asyncio.Queue.shutdown: encerre filas sem deadlocks

    Aprenda asyncio.Queue.shutdown no Python para encerrar filas, liberar workers, drenar tarefas e evitar deadlocks em pipelines assíncronos.

    Ler mais

    Tempo de leitura: 6 minutos
    17/09/2026
    Depuração de processo Python em execução com pdb -p
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    pdb -p no Python: depure processos

    Aprenda a usar pdb -p no Python para anexar o depurador a processos em execução, analisar travamentos e investigar pilhas

    Ler mais

    Tempo de leitura: 7 minutos
    17/09/2026
    Código Python processado em lotes com itertools.batched
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    itertools.batched strict: valide lotes completos

    Aprenda itertools.batched com strict no Python para criar lotes, validar grupos completos e processar dados com segurança.

    Ler mais

    Tempo de leitura: 6 minutos
    16/09/2026
    Análise de dados e cálculos com math.sumprod no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    math.sumprod: produtos escalares e médias ponderadas

    Aprenda math.sumprod no Python para produtos escalares, médias ponderadas, custos e cálculos numéricos claros e eficientes.

    Ler mais

    Tempo de leitura: 5 minutos
    16/09/2026
    Análise de dados CSV com csv.QUOTE_STRINGS no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    csv.QUOTE_STRINGS: preserve tipos em arquivos CSV

    Aprenda csv.QUOTE_STRINGS no Python para cotar textos, preservar tipos e criar arquivos CSV mais previsíveis e seguros.

    Ler mais

    Tempo de leitura: 6 minutos
    15/09/2026
    Código e caminhos de arquivos para PurePath.full_match no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    PurePath.full_match: valide caminhos com glob

    Aprenda PurePath.full_match no Python para validar caminhos completos com padrões glob, controlar maiúsculas e evitar filtros imprecisos.

    Ler mais

    Tempo de leitura: 6 minutos
    15/09/2026