Saltar al contenido

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

Categoría: Formato de archivo
Este artículo está disponible actualmente solo en japonés. Estamos trabajando en las traducciones.

¿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 <strong>Deflate</strong>. Deflate es una combinación de las siguientes dos técnicas.

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

En otras palabras, <strong>los datos con muchos patrones repetitivos tienen una alta tasa de compresión</strong>, 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 <strong>aumentar ligeramente</strong> 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 <strong>Store</strong> 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 <strong>datos aleatorios (secuencias de bytes pseudo-aleatorios)</strong> 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 <strong>patrones de datos repetitivos</strong>
  • El texto, CSV y XML se pueden reducir en <strong>60–85%</strong>
  • JPEG, MP4 y Archivos Precomprimidos <strong>Apenas se Pueden Comprimir</strong> (Pueden Incluso Aumentar Ligeramente)
  • Al combinar archivos ya comprimidos, ahorre CPU con <strong>modo Store (-0)</strong>
  • 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

→ <a href="/ja/files/zip/">Descargar archivos ZIP de prueba aquí</a>

Archivos de prueba para este artículo

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

Artículos relacionados

  • → <a href="/ja/blog/file-format-quick-reference/" class="text-primary-600 dark:text-primary-400 hover:underline">Referencia Rápida de Formatos de Archivo para Desarrolladores</a>
  • → <a href="/ja/blog/file-validation-checklist/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de Verificación de Implementación de Validación de Archivos en Formularios Web</a>

🛠️ Herramientas relacionadas de DevLab