¿Hasta qué punto puede comprimir un archivo comprimido de manera eficiente?

Puede pensar en la compresión como eliminar información redundante. Si te dije “5555555555555555”, eso es un bocado. En cambio, podría decir “5 16 veces”, y me entenderías igual de bien. Yendo más allá, podríamos estar de acuerdo de antemano sobre nuestro protocolo, y podría decirle “5 × 16”. ¡Eso es solo 4 caracteres en lugar de 16 caracteres! No está realmente claro cómo podríamos hacerlo más eficiente que eso. Ahora imagina si en cambio te dijera “555588222555555”. Podríamos intentar usar el mismo protocolo: “5 × 4,8 × 2,2 × 3,5 × 6”. ¡Golly, la versión original y la versión comprimida tienen 15 caracteres! Además de eso, si intentamos volver a comprimir, ¿qué sucede? “5 × 1, xx1,4 × 1“ x1,8 × 1, xx1,2 × 1“ x1 …” ¡Bueno, ahora es mucho más largo que el original!

Básicamente, la compresión de datos funciona encontrando patrones en los datos y luego describiendo los datos usando esos patrones. Si la versión comprimida de los datos todavía tiene patrones, el algoritmo de compresión no hizo un muy buen trabajo. Con un buen algoritmo de compresión como zip, una vez que se comprimen los datos, esos patrones desaparecen casi por completo.

Podrías pensar en lo compresible que es algo por lo interesante que es. Un montón de valores repetidos en una fila es aburrido y se comprime fácilmente. Una secuencia de números completamente aleatoria salta por todo el lugar y solo se repite por pura suerte, y no se comprime bien en absoluto. Curiosamente, los datos comprimidos generalmente parecen más aleatorios que los datos no comprimidos.

Contrariamente a la creencia popular, el número correcto con un archivo zip es (o al menos puede ser) 2, pero la ganancia en compresión la segunda vez generalmente será extremadamente pequeña.

La razón de esto es bastante simple: junto con los archivos en sí, un archivo zip contiene un directorio de los archivos contenidos en el archivo zip. Esta información del directorio no está (al menos normalmente) comprimida en absoluto.

Por lo tanto, si comprime algunos archivos (especialmente si se trata de una cantidad bastante grande de archivos), el archivo zip contendrá los nombres de los archivos (junto con algunos fragmentos de información relacionada) sin ninguna compresión.

Cuando comprimes ese archivo zip, esa información del directorio se comprimirá. Aún tendrá un directorio en el archivo zip externo, pero solo contendrá un nombre de archivo (el nombre del archivo zip interno). Comprimir la información del directorio en el archivo zip interno dará una pequeña (pero usualmente medible) reducción en el tamaño total.

Sin embargo, esto depende del archivo zip que contiene una cantidad sustancial de información de directorio sin comprimir. Si (por ejemplo) tomó un solo archivo grande y lo comprimió, luego trató de comprimir ese resultado, normalmente no obtendría nada, porque el primer archivo zip contendría poca (o ninguna) información de directorio más compresible que el segundo.

Si desea una mejor compresión, generalmente obtendrá mejores resultados (bastante mejores en muchos casos) al juntar todos los archivos de origen en un solo archivo (por ejemplo, con tar) y luego comprimir ese único archivo. Esto mejora la compresión porque en un archivo zip normal, cada archivo se comprime por separado, por lo que la compresión se reinicia al comienzo de cada archivo. Zip utiliza un LZ basado en la búsqueda de repeticiones de cadenas que se encontraron anteriormente. Hacia el comienzo de cada archivo, la compresión es bastante pobre porque no hay cadenas anteriores que coincidan.

Por ejemplo, al hacer una prueba rápida de algunos archivos fuente C en mi disco duro, si solo los comprimo, obtengo un archivo de 339,666 bytes, pero si los juntamos, luego comprimo ese archivo tar, obtengo un archivo de 258,764 bytes Esta es (la mayoría de) las razones por las que los archivos tar comprimidos también obtienen una mejor compresión, no es que el propio gzip sea mejor; es solo esa concatenación primero, luego la compresión obtiene una mejor compresión (como regla) que la compresión primero, luego la concatenación. La desventaja es más obvia: un archivo zip normal está abierto a más manipulación, por ejemplo, puede agregarle archivos o eliminarlos sin alterar los otros archivos. Si concatena primero, entonces debe descomprimir todo, separar los archivos individuales, hacer sus adiciones y / o eliminaciones, luego volver a concatenar y volver a comprimir.

¿Prácticamente? 1 … más es un desperdicio (en el mejor de los casos) en casi todos los casos.

Probablemente encontrará poco o ningún beneficio en la compresión por segunda vez. Hay excepciones, pero son extremadamente raras y / o solo hacen una cantidad minúscula de compresión extra. Definitivamente no vale la pena gastar el tiempo en comprimir una segunda vez. No importa más veces.

Incluso puede empeorar más que eso. Si el programa que utiliza para crear el zip es muy simple, es posible que no compruebe si el archivo comprimido se ha vuelto más pequeño. Y simplemente ejecutando algo como el algoritmo de compresión de desinflado predeterminado en algo que ya estaba comprimido (o es tan aleatorio que no es muy compresible), el archivo puede incluso hacerse más grande, es decir, la segunda vez que va hacia atrás. si el programa es solo un poco más inteligente, puede verificar si el archivo realmente se redujo de tamaño; de lo contrario, puede cambiar a un algoritmo diferente, tal vez incluso almacenar el archivo tal como está.

Entonces, en general, el punto que estás buscando es UNA VEZ. Las posibilidades de que un segundo reduzca el tamaño del archivo de manera apreciable son casi nulas, mientras que la posibilidad de que incluso aumente el tamaño casi de la misma manera (si no mejor).

Hay algunas excepciones: en primer lugar, como mencionó Jerry Coffin, la tabla que enumera los archivos dentro del zip no está comprimida, por lo que si hay una gran cantidad de archivos dentro de una segunda ejecución, puede reducir considerablemente esta parte del archivo zip, dependiendo de cómo muchos patrones se repiten en esa tabla (es decir, cuánto son similares los nombres de archivo, tamaños, atributos, etc.) y cuántos de ellos hay.

Una segunda posibilidad (aunque casi inexistente en la práctica) es si varios archivos son exactamente iguales y están comprimidos en un solo zip, cada uno se ve como un grupo de compresión separado. Una segunda vez, el primer archivo zip se ve como un grupo, por lo que es posible que algunas partes simplemente se repitan. Sin embargo, esto es muy poco probable que funcione. Encontraría que en este caso concatenar los archivos antes de comprimirlos la primera vez (como Jerry también sugiere) dará resultados mucho mejores en todos los casos.

La única forma de comprimir mejor que el primer zip es usar un compresor que funcione mejor para ese tipo de archivos. Zip es una forma de compresión bastante antigua, es rápida, pero generalmente no es la mejor para el archivo promedio. Existen muchos otros algoritmos de compresores que tienden a funcionar al menos un poco mejor en promedio, y MUCHO MÁS en tipos de archivos particulares. Algunos otros hacen una forma de compresión “sólida”. En efecto, concatenan todos los archivos de antemano automáticamente. es decir, no necesita ejecutar tar y luego zip. Muestras de estos son RAR y 7Zip (7Z), usan esta forma de compresión por defecto.

Sin embargo, en todos estos casos, lo mismo es cierto: comprimir una segunda ronda es muy poco probable que reduzca el tamaño del archivo de manera apreciable (si es que lo hace). Si encuentra que sí, entonces el compresor está realmente muy mal diseñado.

En realidad es peor que eso. Digamos que ya ha comprimido algunos archivos juntos. Luego ejecuta ese archivo zip a través de algo como rar. De hecho, descubrirás que no funciona mucho mejor. en realidad sería peor que simplemente usar rar en primer lugar.

Ese punto es 1, en el caso general.

Una vez que haya comprimido un archivo (usando el algoritmo de desinflado más común), cualquier intento adicional de comprimir ese archivo aumentará el tamaño del nuevo zip.

Esto se debe a que el algoritmo ya ha hecho su mejor esfuerzo la primera vez (dependiendo del nivel de compresión que se especificó). En el archivo comprimido, no hay más información redundante que pueda comprimirse aún más utilizando el mismo algoritmo.