Saltar al contenido

¿Por qué la tasa de compresión de ZIP varía enormemente según el archivo?

Categoría: Formato de archivo

¿Alguna vez has experimentado 「el archivo apenas se hizo más pequeño incluso después de la compresión ZIP」 o 「los archivos de texto redujeron drásticamente el tamaño después de la compresión」? Las tasas de compresión ZIP varían enormemente según el tipo de archivo. Este artículo explica las razones y características de cada formato de archivo.

Tamaño comprimido por tipo de archivo (vs 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%
Diagrama: ratio de compresión ZIP por tipo de archivo (menor = mejor)

Algoritmo de compresión utilizado en ZIP: Deflate

El formato ZIP (.zip) utiliza principalmente el algoritmo Deflate. Deflate es una combinación de las siguientes dos técnicas.

  • LZ77 (Lempel-Ziv 1977): Reemplaza patrones repetidos en datos con referencias a ocurrencias anteriores
  • Codificación Huffman: Representa caracteres frecuentes con secuencias de bits más cortas

En otras palabras, los datos con muchos patrones repetitivos tienen una alta tasa de compresión, mientras que los datos aleatorios o ya comprimidos apenas se pueden comprimir.

Tasa de compresión por formato de archivo

Formato de archivoRatio de compresión (aproximado)Razón
Texto (.txt)Reducción del 60–80%Muchos caracteres y palabras repetidos
CSV70–85% de reducciónEl delimitador y el mismo patrón se repiten
HTML / XML / JSONReducción del 65–85%Repetición frecuente de etiquetas y nombres de claves
Archivo de registro70–90% de reducciónRepetición frecuente del formato de marca de tiempo
BMP (imagen sin comprimir)Reducción del 50–80%Muchos píxeles consecutivos del mismo color
PDFReducción del 5–20%En muchos casos, ya está comprimido con zlib internamente
PNGReducción de 0–5%Ya comprimido con Deflate
JPEGReducción de 0–5%Ya comprimido con DCT + Huffman
MP3 / AAC0–3% de reducciónYa comprimido con compresión con pérdida
MP4 / H.2640–3% de reducciónYa altamente comprimido
ZIP / GZ / 7z0–2% de reducción (puede aumentar en algunos casos)La recompresión de datos ya comprimidos es en gran medida ineficaz

Cuando los archivos comprimidos se hacen aún más grandes

Al comprimir archivos ya comprimidos como JPEG o MP4 con ZIP, el tamaño del archivo puede aumentar ligeramente debido a los encabezados ZIP (metadatos de archivo). Esto se debe a que el formato ZIP incluye un encabezado de archivo local (30 bytes o más) para cada archivo y un directorio central para todo el archivo.

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

Diferencia con el modo 「Store」

ZIP tiene un modo Store que almacena archivos sin compresión. Al combinar múltiples archivos ya comprimidos (como JPEG, MP4, etc.), el uso del modo Store elimina la carga de CPU del procesamiento de compresión mientras se almacenan en tamaños equivalentes.

# 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 de los archivos ZIP de prueba

Los archivos ZIP de prueba de DevLab contienen datos aleatorios (secuencias de bytes pseudo-aleatorios) para controlar precisamente el tamaño del archivo. Dado que los datos aleatorios tienen entropía máxima, la compresión Deflate es prácticamente ineficaz. Por lo tanto, un "archivo ZIP de 10MB" sigue siendo aproximadamente "10MB después de la descompresión."

Si necesita un archivo ZIP que alcance un tamaño específico después de la extracción, puede crear un archivo de prueba usando un método como el siguiente.

# 解凍後ちょうど 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 -

Resumen

  • La tasa de compresión de ZIP está determinada por la abundancia de patrones de datos repetitivos
  • El texto, CSV y XML se pueden reducir en 60–85%
  • JPEG, MP4 y Archivos Precomprimidos Apenas se Pueden Comprimir (Pueden Incluso Aumentar Ligeramente)
  • Al combinar archivos ya comprimidos, ahorre CPU con modo Store (-0)
  • Los archivos ZIP de prueba de DevLab utilizan datos aleatorios, por lo que el tamaño se mantiene prácticamente igual antes y después de la descompresión

Descargar archivos ZIP de prueba aquí

Archivos de prueba para este artículo

❓ Preguntas frecuentes

¿Por qué ZIP apenas reduce algunos archivos?
JPEG, PNG, MP3 y MP4 ya están comprimidos, así que al algoritmo Deflate de ZIP no le queda casi nada que exprimir. Comprimir un archivo ya comprimido incluso puede aumentarlo un poco por las cabeceras ZIP. Los datos con mucha repetición —texto, CSV, HTML, XML— suelen reducirse entre un 60% y un 85%.
¿Qué es el modo Store de ZIP y cuándo conviene usarlo?
El modo Store guarda los archivos tal cual, sin comprimir. Va bien para agrupar ficheros ya comprimidos, como JPEG o MP4: obtienes el mismo tamaño de archivo sin pagar el coste de CPU de comprimir. Se indica con la opción -0 del comando zip.
¿Qué tipos de archivo se comprimen mejor en ZIP?
Los archivos de log son los que mejor comprimen, entre un 70% y un 90%, seguidos de CSV (70-85%), HTML, XML y JSON (65-85%) y texto plano (60-80%). Todos están llenos de repeticiones, justo lo que aprovechan las referencias LZ77 y la codificación Huffman de Deflate.