Por que a taxa de compressão ZIP varia muito entre arquivos
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.
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 arquivo | Taxa de compressão (referência) | Razão |
|---|---|---|
| Texto (.txt) | 60〜80% de redução | Muitos caracteres e palavras repetidos |
| CSV | 70〜85% de redução | Delimitador e padrão idêntico se repetem |
| HTML / XML / JSON | 65〜85% de redução | Muita repetição de nomes de tags e chaves |
| Arquivo de log | 70〜90% de redução | Muita 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 |
| Redução de 5 a 20% | Na maioria dos casos, é pré-comprimido com zlib internamente | |
| PNG | Redução de 0 a 5% | Já comprimido com Deflate |
| JPEG | Redução de 0 a 5% | Já comprimido com DCT + Huffman |
| MP3 / AAC | Redução de 0–3% | Já comprimido com compressão com perda |
| MP4 / H.264 | Redução de 0–3% | Já altamente comprimido |
| ZIP / GZ / 7z | Reduçã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>