¿Por qué Zip puede comprimir archivos individuales mejor que varios archivos con el mismo contenido?
Poder comprimir nuestros archivos para que sea más fácil compartirlos y / o transportarlos puede hacer que nuestras vidas electrónicas sean mucho más fáciles, pero a veces podemos ver resultados de tamaño imprevistos o inesperados después de comprimirlos. ¿Porqué es eso? La publicación de preguntas y respuestas de SuperUser de hoy tiene las respuestas a las preguntas de un lector confundido.
La sesión de Preguntas y Respuestas de hoy nos llega por cortesía de SuperUser, una subdivisión de Stack Exchange, un grupo de sitios web de preguntas y respuestas impulsado por la comunidad..
Foto cortesía de Jean-Etienne Minh-Duy Poirrier (Flickr).
La pregunta
Superusuario lector sixtyfootersdude quiere saber por qué zip es capaz de comprimir archivos individuales mejor que múltiples archivos con el mismo tipo de contenido:
Supongamos que tengo 10.000 archivos XML y quiero enviarlos a un amigo. Antes de enviarlos, me gustaría comprimirlos..
Método 1: no comprimirlos
Resultados:
Método 2: comprima cada archivo por separado y envíe 10.000 archivos XML comprimidos
Mando:
Resultados:
Método 3: Cree un único archivo zip que contenga todos los 10,000 archivos XML
Mando:
Resultados:
Método 4: Concatene los archivos en un solo archivo y comprímalo
Mando:
Resultados:
Preguntas
- ¿Por qué obtengo resultados tan mejores cuando estoy comprimiendo un solo archivo??
- Esperaba obtener mejores resultados drásticamente utilizando el método 3 en lugar del método 2, pero no lo hago. Por qué es esto?
- ¿Es este comportamiento específico para zip? Si intentara usar Gzip, obtendría resultados diferentes?
Información adicional
Metadatos
Una de las respuestas dadas sugiere que la diferencia son los metadatos del sistema que se almacenan en el archivo zip. No creo que este pueda ser el caso. Para probarlo, hice lo siguiente:
El archivo zip resultante es de 1.4 MB. Esto significa que todavía hay aproximadamente diez MB de espacio sin explicación..
¿Por qué zip es capaz de comprimir archivos individuales mejor que varios archivos con el mismo tipo de contenido??
La respuesta
Los colaboradores del superusuario Alan Shutko y Aganju tienen la respuesta para nosotros. En primer lugar, Alan Shutko:
La compresión Zip se basa en patrones repetitivos en los datos a comprimir, y la compresión mejora cuanto más largo es el archivo, ya que se pueden encontrar y usar más y más patrones..
Simplificado, si comprime un archivo, el diccionario que asigna códigos (cortos) a patrones (más largos) está necesariamente contenido en cada archivo zip resultante; Si comprime un archivo largo, el diccionario se 'reutiliza' y se vuelve aún más efectivo en todo el contenido..
Si sus archivos son incluso un poco similares (como siempre lo es el texto), la reutilización del 'diccionario' se vuelve muy eficiente y el resultado es un archivo zip total mucho más pequeño.
Seguido por la respuesta de Aganju:
En zip, cada archivo se comprime por separado. Lo opuesto es compresión sólida, es decir, los archivos se comprimen juntos. 7-zip y Rar utilizan compresión sólida por defecto. Gzip y Bzip2 no pueden comprimir varios archivos, por lo que Tar se usa primero y tiene el mismo efecto que la compresión sólida.
Como los archivos xml tienen una estructura similar (y probablemente un contenido similar), si los archivos se comprimen juntos, la compresión será mayor.
Por ejemplo, si un archivo contiene la cadena "
”Y el compresor ya encontró esa cadena en otro archivo, la reemplazará con un pequeño puntero a la coincidencia anterior. Si el compresor no usa compresión sólida, la primera aparición de la cadena en el archivo se registrará como literal, que es mas grande.
¿Tienes algo que agregar a la explicación? Apaga el sonido en los comentarios. ¿Quieres leer más respuestas de otros usuarios de Stack Exchange con experiencia en tecnología? Echa un vistazo a la discusión completa aquí.