¿Cuál es la relación de compresión máxima de gzip?

Respuestas:

91

Depende mucho de los datos que se comprimen. Una prueba rápida con un archivo de 1 Gb lleno de ceros proporciona un tamaño comprimido de ~ 120 Kb, por lo que su archivo de 10 Kb podría expandirse a ~ 85 Mb.

Si los datos tienen poca redundancia para comenzar, por ejemplo, el archivo contiene archivos de imágenes en un formato comprimido de forma nativa (gif, jpg, png, ...), entonces gzip puede no agregar más compresión. Para archivos binarios como ejecutables de programas, es posible que vea una compresión de hasta 2: 1, para texto plano, HTML u otras marcas 3: 1 o 4: 1 o más no es improbable. Es posible que vea 10: 1 en algunos casos, pero el ~ 8700: 1 visto con un archivo lleno con un solo símbolo es algo que no va a ver fuera de circunstancias artificiales similares.

Puede verificar cuántos datos resultarían de desempaquetar un archivo gzip, sin escribir realmente su contenido sin comprimir en el disco, gunzip -c file.gz | wc --bytesesto descomprimirá el archivo pero no almacenará los resultados, sino wcque los pasará a los cuales contarán el número de bytes a medida que pasan luego descartarlos. Si el contenido comprimido es un archivo tar que contiene muchos archivos pequeños, es posible que se necesite notablemente más espacio en el disco para descomprimir el archivo completo, pero en la mayoría de los casos, el recuento devuelto por la gunzipsalida de la tubería wcserá tan preciso como sea necesario.

David Spillett
fuente
He visto cómo HTML se expandía a 10x (¡por supuesto, x3 y x4 era el más común!) ... quizás una gran cantidad de datos redundantes para aquellos que explotaban + 8x. Creo que la página en cuestión que estaba haciendo eso era una página de información de php.
Zombis
El marcado repetitivo, como se ve en la salida de phpinfo(), se comprime muy bien. La información técnica en ese resultado contiene más repetición directa que la porción promedio del lenguaje natural también, y la distribución del alfabeto es probablemente menos uniforme, lo que podría ayudar a la etapa de Huffman a obtener mejores resultados.
David Spillett
Esta respuesta no tiene en cuenta los datos comprimidos intencionalmente maliciosos . Uno puede crear un archivo zip malicioso de alrededor de 10 KB que puede expandirse a un poco más de 4 GB.
David Schwartz
Sin embargo, las bombas Zip de esa escala dependen de archivos anidados, por lo que cuando un humano desempaque el archivo, notará algo extraño en poco tiempo. Sin embargo, pueden usarse como un ataque DoS efectivo contra escáneres automáticos (en servicios de correo, etc.).
David Spillett el
1
@DavidSpillett: las bombas zip anidadas se expanden en tamaños en el rango de petabytes. Eso no es de lo que estoy hablando. Mire incluso una sola capa de una típica bomba zip.
David Schwartz
10

Por lo general, no obtiene más del 95% de compresión (por lo que los datos comprimidos de 10kB se descomprimirían a ~ 200kB), pero hay archivos especialmente diseñados que se expanden exponencialmente. Busque 42.zip, descomprime a pocos petabytes de datos (sin sentido).

liori
fuente
44
Wikipedia dice que 42.zip "contiene cinco capas de archivos zip anidados en conjuntos de 16", por lo que no es un ejemplo válido para la descompresión (solo para la descompresión recursiva).
Tgr
55
De hecho, 42.zip es específicamente un peligro para las herramientas que escanean automáticamente archivos zip de forma recursiva, por ejemplo, escáneres de virus.
thomasrutter
44
Eso es zip, no gzip
BeniBela
8

Citado textualmente de https://stackoverflow.com/a/16794960/293815

La relación de compresión máxima del formato desinflado es 1032: 1. Esto se debe a que la ejecución más larga que puede codificarse es de 258 bytes. Se requieren al menos dos bits para cada ejecución (un bit para el código de longitud y un bit para el código de distancia), por lo tanto, 4 * 258 = 1032 bytes sin comprimir pueden codificarse por un byte comprimido.

Puede obtener más compresión al comprimir el resultado de gzip. Normalmente eso no mejora la compresión, pero puede funcionar durante largos períodos.

Por cierto, el enfoque LZ77 utilizado por deflate es más general que la codificación de longitud de ejecución. En lugar de solo una longitud, se usa un par longitud / distancia. Esto permite copiar una cadena desde cierta distancia, o replicar un byte como en la longitud de ejecución para una distancia de uno, o replicar triples de bytes con una distancia de tres, etc.

ioquatix
fuente
6

La relación de compresión de cualquier algoritmo de compresión será una función de los datos que se comprimen (además de la longitud de esos datos).

Aquí hay un análisis en MaximumCompression ,
mira una de las muestras como,

Resumen de las pruebas de referencia de compresión de archivos múltiples

Tipo de archivo: múltiples tipos de archivos (46 en total)  
# de archivos para comprimir en esta prueba: 510  
Tamaño total del archivo (bytes): 316.355.757 
Tamaño promedio de archivo (bytes): 620,305
Archivo más grande (bytes): 18,403,071
Archivo más pequeño (bytes): 3,554
nik
fuente
4

Un archivo enorme que contiene solo un símbolo se comprimirá muy bien.

friki
fuente
4

10 MB de ceros en el archivo, comprimir con gzip -9 a 10217. Por lo tanto, la relación máxima parece estar alrededor de 1000x.

nikos
fuente
1

La respuesta a su pregunta, depende de la entrada. Para darle una idea de cómo se realiza la compresión, vea estos videos de seis minutos.

https://www.youtube.com/watch?v=ZdooBTdW5bM

Lo que debe obtener de él es que la tasa de compresión depende de la frecuencia de cada carácter, por lo tanto, no hay una tasa máxima de generel, depende de la entrada, para el texto en inglés es aproximadamente el 65 por ciento.

brunsgaard
fuente
1
¡Bienvenido a Super User! Cite las partes esenciales de la respuesta de los enlaces de referencia, ya que la respuesta puede volverse inválida si las páginas enlazadas cambian.
DavidPostill
Sería más exacto decir "frecuencia de cada cadena" en lugar de "frecuencia de cada carácter"
JoelFan