Skip to content

Por que a taxa de compressão ZIP varia muito entre arquivos

Categoria:Formato de arquivo
Este artigo está disponível atualmente apenas em japonês. As versões traduzidas serão publicadas sequencialmente.

Você já experimentou 「o arquivo não ficou muito menor mesmo depois de compactado com ZIP」 ou 「o arquivo de texto reduziu dramaticamente de tamanho após compactação」? A taxa de compactação ZIP varia muito dependendo do tipo de arquivo. Este artigo explica os motivos e as características de cada formato de arquivo.

Tipo de arquivo e tamanho após compressão (comparado a 100% original) 0% 100% TXT / CSV ~15% JSON / XML ~20% HTML / CSS / JS ~25% DOCX / XLSX ~90% PDF ~95% JPEG / PNG / MP3 ~99% MP4 / ZIP ~100%
Figura: Comparação de taxa de compressão ZIP por tipo de arquivo (menor = mais eficaz)

Algoritmo de compressão usado em ZIP: Deflate

O formato ZIP (.zip) usa principalmente o algoritmo <strong>Deflate</strong>. O Deflate é uma combinação das 2 tecnologias a seguir.

  • <strong>LZ77(Lempel-Ziv 1977)</strong>: Substitui padrões repetidos nos dados por 「referências para posições onde apareceram anteriormente」
  • <strong>Codificação de Huffman</strong>: representa caracteres com alta frequência de ocorrência como sequências de bits curtas

Em outras palavras, <strong>quanto mais padrões repetidos um dados tiver, maior será a taxa de compressão</strong>, enquanto dados aleatórios ou já comprimidos não podem ser comprimidos significativamente.

Taxa de compressão por formato de arquivo

Formato de arquivoTaxa de compressão (referência)Razão
Texto (.txt)60〜80% de reduçãoMuitos caracteres e palavras repetidos
CSV70〜85% de reduçãoDelimitador e padrão idêntico se repetem
HTML / XML / JSON65〜85% de reduçãoMuita repetição de nomes de tags e chaves
Arquivo de log70〜90% de reduçãoMuita repetição de formato de timestamp
BMP (imagem sem compressão)Redução de 50 a 80%Muitas sequências de pixels da mesma cor
PDFRedução de 5 a 20%Na maioria dos casos, é pré-comprimido com zlib internamente
PNGRedução de 0 a 5%Já comprimido com Deflate
JPEGRedução de 0 a 5%Já comprimido com DCT + Huffman
MP3 / AACRedução de 0–3%Já comprimido com compressão com perda
MP4 / H.264Redução de 0–3%Já altamente comprimido
ZIP / GZ / 7zRedução de 0–2% (tamanho pode aumentar em alguns casos)Recompressão de dados já comprimidos é praticamente ineficaz

Quando arquivos comprimidos ficam ainda maiores

Ao compactar arquivos já comprimidos como JPEG e MP4 com ZIP, o tamanho pode <strong>aumentar ligeiramente</strong> pelo tamanho do cabeçalho ZIP (metadados do arquivo). Isso ocorre porque o formato ZIP possui um cabeçalho de arquivo local (30 bytes ou mais) para cada arquivo e um diretório central para todo o ZIP.

JPEGファイル (1.00 MB)
 └── ZIP圧縮後: 1.00 MB + ヘッダー(約50B)= わずかに増加

Diferença entre usar o modo 「Store」

ZIP possui um modo <strong>Store</strong> que armazena arquivos sem compressão. Ao agrupar vários arquivos já compactados (como JPEG, MP4, etc.), usar o modo Store elimina a carga de CPU do processamento de compressão enquanto mantém um tamanho equivalente.

# zip コマンドで圧縮レベルを指定
zip -0 archive.zip image.jpg video.mp4   # Store(圧縮なし)
zip -9 archive.zip data.csv report.txt   # 最大圧縮

# Python で圧縮レベルを指定
import zipfile
with zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as zf:
    zf.write('data.csv')

Características do arquivo ZIP de teste

Os arquivos ZIP de teste do DevLab armazenam <strong>dados aleatórios (sequências de bytes pseudo-aleatórias)</strong> para controlar com precisão o tamanho do arquivo. Como os dados aleatórios têm entropia máxima, eles quase não são comprimidos por Deflate. Portanto, 「arquivo ZIP de 10MB」 = 「aproximadamente 10MB mesmo após descompactação」.

Se você precisar de um arquivo ZIP que tenha um tamanho específico após descompactação, você pode criar um arquivo de teste usando o método a seguir.

# 解凍後ちょうど 100MB になるZIPを作成(ゼロバイト埋め、高圧縮)
dd if=/dev/zero bs=1M count=100 | zip -9 zero-100mb.zip -

# 解凍後ちょうど 100MB になるZIPを作成(ランダムデータ、ほぼ無圧縮)
dd if=/dev/urandom bs=1M count=100 | zip -0 random-100mb.zip -

Resumo

  • A taxa de compressão ZIP é determinada pela quantidade de <strong>padrões repetitivos nos dados</strong>
  • Texto, CSV e XML podem ser reduzidos em <strong>60-85%</strong>
  • JPEG, MP4 e arquivos já comprimidos <strong>quase não podem ser comprimidos</strong> (na verdade aumentam ligeiramente)
  • Ao agrupar arquivos já comprimidos, economize CPU com <strong>modo Store (-0)</strong>
  • As ZIPs de teste do DevLab usam dados aleatórios, portanto têm aproximadamente o mesmo tamanho antes e depois da descompactação

→ <a href="/ja/files/zip/">Baixe arquivos ZIP de teste aqui</a>

Arquivo de teste disponível para usar neste artigo

  • → <a href="/ja/files/zip/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos de teste ZIP</a>
  • → <a href="/ja/files/csv/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos de teste CSV</a>

Artigos relacionados

  • → <a href="/ja/blog/file-format-quick-reference/" class="text-primary-600 dark:text-primary-400 hover:underline">Referência rápida de formato de arquivo para desenvolvedores</a>
  • → <a href="/ja/blog/file-validation-checklist/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de verificação de implementação de validação de arquivo para formulários web</a>