¿Por qué un archivo 7zipped es más grande que el archivo sin procesar? [duplicar]

37

Posible duplicado:
¿Por qué la compresión ZIP no comprime nada?

Intenté 7zipping un archivo .exe pero en realidad se hizo más grande.

ingrese la descripción de la imagen aquí

¿Es este el resultado esperado?

SOY B
fuente
3
Sí, es el resultado esperado. ¿Por qué? Porque cuando algo ya está comprimido (= usando el espacio más pequeño posible), no se puede comprimir más.
woliveirajr
44
Solo para agregar a todos los demás: dado que este archivo exe específicamente es un instalador, la mayor parte de su contenido es probablemente un archivo zip o cab. No obtendría los mismos resultados de un archivo exe normal (pero la mayoría de los archivos exe normales no serán 145 megabytes)
Random832
1
Explicación utilizando solo lógica básica: la compresión encuentra para un archivo sin procesar un archivo comprimido ÚNICO, y para un archivo comprimido archivo original SIN COMBUSTIBLE (sin comprimir). Imagine que tiene archivos de 8 bits y desea comprimirlos en archivos de 5 bits. Hay 256 archivos únicos de 8 bits, pero solo 32 archivos únicos de 5 bits (!) Por lo tanto, algunos archivos de 8 bits deben comprimirse en el mismo archivo de 5 bits (!). Y si 2 archivos RAW diferentes se comprimen en el mismo archivo ZIP, ¿cuál desea obtener después de la descompresión? Para cualquier método de compresión, si existen archivos que se vuelven más pequeños después de la compresión, deben existir archivos, que se hacen más grandes (!)
Ivan Kuckir

Respuestas:

78

Se reduce a un concepto llamado entropía . Ver Wikipedia .

La idea básica es que, si existiera una operación de compresión que siempre pudiera hacer un archivo más pequeño, entonces la lógica dicta que dicha operación de compresión podría reducir cualquier archivo a 0 bytes y aún retener todos los datos. Pero esto es absurdo , porque sabemos que 0 bytes no pueden transmitir ninguna información. Por lo tanto, acabamos de demostrar que no puede existir un algoritmo de compresión que siempre reduzca su entrada, porque si ese fuera el caso, cualquier información podría almacenarse en 0 bytes, pero 0 bytes implica la ausencia de información, por lo que puede ' t simultáneamente no tiene información y toda la información. Por lo tanto, es absurdo.

Debido a este concepto teórico, cada programa de compresión que utilice aumentará el tamaño de (o, en el mejor de los casos, mantendrá el mismo tamaño de) alguna entrada. Es decir, para cualquier algoritmo de compresión que diseñe o use, habrá ciertas entradas que saldrán más pequeñas, y algunas que no.

Los datos ya comprimidos son generalmente un candidato terrible para una mayor compresión, porque la mayoría de los algoritmos de compresión sin pérdidas se basan en los mismos principios teóricos. Se es posible comprimir datos comprimidos mal aún más; pero esto es menos eficiente que simplemente comprimirlo con el mejor algoritmo disponible de los datos originales para empezar.

Por ejemplo, si tenía un archivo de texto de 100 MB y lo comprime utilizando el algoritmo Zip normal, podría comprimirse hasta 50 MB. Si luego comprime el archivo Zip con LZMA2, puede reducirlo a 40 o 45 MB, porque LZMA tiene una relación de compresión más alta para la mayoría de los datos comprimibles que Zip. Por lo tanto, es lógico pensar que también puede comprimir datos Zip, porque Zip no absorbe por completo toda la entropía. Pero si elimina el contenedor Zip por completo, es posible que pueda hacerlo aún más pequeño al comprimir el texto sin procesar con LZMA2, lo que podría generar algo del orden de 30 a 35 MB (estos son solo "números aéreos" para ilustrar el concepto) .

En el caso de ese binario que está intentando comprimir, es más grande porque el formato de archivo 7-Zip tiene que crear su propia estructura interna y empacar los datos del ejecutable ya comprimido en el formato 7-Zip. Esto contiene cosas como un diccionario, un encabezado de archivo, etc. Estos datos adicionales generalmente están más que compensados ​​por el ahorro de comprimir los datos en sí, pero parece que el ejecutable que está tratando de comprimir ya está comprimido con alguna forma de LZMA; de lo contrario, probablemente reducirá el tamaño del ejecutable o lo aumentará muy ligeramente, en lugar de aumentarlo en 2 MB (que es mucho).

allquixotic
fuente
Por cierto, la parte más importante para responder a esta pregunta está justo al final: "Esto contiene cosas como un diccionario, un encabezado de archivo, etc. Estos datos adicionales generalmente están más que compensados ​​por el ahorro de comprimir los datos en sí, pero parece que el ejecutable que estás intentando comprimir ya está comprimido con algún tipo de LZMA "
jhocking
66
@jhocking: No, la parte más importante es hacia el medio: "Cada programa de compresión que utilices aumentará el tamaño de ... alguna entrada". El formato de archivo de 7zip tiene un diccionario / encabezado de archivo / etc., pero incluso si 7zip usara un algoritmo que no tuviera ninguna de esas cosas, todavía tenemos la garantía de que algunas (de hecho, la mayoría) las entradas tendrán salidas que son tan grande o más grande que las entradas mismas. Este es un hecho básico de la teoría de la información, y no tiene nada que ver con los encabezados de archivos.
BlueRaja - Danny Pflughoeft
2
@Mehrdad Seguro: solo escriba un algoritmo de "compresión" que siempre devuelva la entrada original. Allí; hecho. : P ... Aparte de eso, no, cualquier algoritmo de compresión que sea un algoritmo tendrá algunos metadatos, incluso si es solo un bit al inicio del archivo que indica si el archivo está comprimido o no (0 == sin comprimir, 1 == comprimido). Si va a modificar el contenido del archivo en absoluto , necesita algunos metadatos. Y si está modificando el contenido, aumentará algunas entradas.
allquixotic
1
Sin embargo, si su pregunta era "¿Hay algún algoritmo de compresión que no aumente la longitud de la entrada más allá de una cantidad fija de metadatos", la respuesta es: No lo sé, pero debería ser teóricamente posible hacerlo. Fácil, de hecho. Todo lo que tiene que hacer es desarrollar un formato contenedor que puede o bien contener el archivo original, o un flujo de datos comprimidos. Luego, cuando cree el archivo, intente comprimir: si el tamaño comprimido es mayor que la entrada, simplemente almacene la entrada original y empaque sus metadatos al frente. El tamaño del archivo aumentará, pero si los metadatos son pequeños (continuación)
allquixotic
2
@Mehrdad: "¿Hay algún algoritmo de compresión (por pobre que sea) que no aumente la longitud de ninguna entrada? " - La respuesta es no. Hay 2^(n+1)-1posibles mensajes de tamaño n-bits o menos. Nuestro algoritmo debe asignar cada uno de estos a una salida única . Si incluso uno de estos se asigna a un valor con menos bits, otro valor necesariamente debe asignarse a uno con más.
BlueRaja - Danny Pflughoeft
7

Los algoritmos de compresión subyacentes utilizados en 7z no tienen pérdidas . Lo que significa que puede comprimir-descomprimir iterativamente un archivo muchas veces. Además, después de cada iteración, el archivo permanecerá exactamente igual.

Desafortunadamente, no puede esperar que se aplique un algoritmo de compresión sin pérdidas muchas veces con un resultado siempre positivo. Hay un límite estricto que no puede saltar. Aproximadamente, este límite depende de qué tan cerca una secuencia de entrada ensambla datos aleatorios. Sobre todo, los algoritmos sin pérdida se utilizan para la compresión de archivos, transferencias de datos HTML de Internet, copias de seguridad y otras operaciones que esperan que un archivo de salida se descomprima en exactamente el mismo archivo de entrada original.

A diferencia de la compresión sin pérdida, siempre puede esperar una disminución del tamaño del archivo después de la compresión con algoritmos de compresión con pérdida (o pérdida) . La desventaja es que no puede restaurar exactamente un archivo original después de una sola iteración de compresión-descompresión. Estos algoritmos son más famosos por las transmisiones y almacenamiento de audio / video / imagen.

bzip2 , LZMA , LZMA2 y otros algoritmos utilizados por el formato 7z no tienen pérdidas . Por lo tanto, habrá un límite después del cual ya no se puede comprimir. Además de eso, las imágenes ejecutables (.exe) suelen ser archivos muy comprimidos. 7zip como muchas otras herramientas de compresión incrusta algunos metadatos, que de hecho pueden agrandar el archivo de salida.

Rompecabezas: ¿y si tuviéramos un algoritmo sin pérdidas que siempre puede disminuir el tamaño de un archivo?

En este caso, siempre verá que el archivo comprimido es más pequeño que el archivo de entrada. Vea un comentario a continuación por qué no es posible.

oleksii
fuente
55
Prueba por contagio. Hipótesis: suponga que siempre es posible comprimir un archivo con un algoritmo sin pérdidas. Paso 1. La compresión única hace que un archivo de salida sea más pequeño al menos un bit. Si es así, después de varias iteraciones terminaremos con un archivo que solo tiene dos bits. Paso 2 La siguiente iteración crea un archivo de un tamaño de 1 bit. Paso 3 Pero los algoritmos de compresión no tienen pérdidas, lo que significa que solo se permite una descompresión válida. Claramente, no puede restaurar 2 bits originales de 1 bit comprimido, tendrá que adivinar. El último punto viola la hipótesis.
oleksii
No puede garantizar un algoritmo que reduzca el tamaño del archivo, pero puede garantizar uno que no aumente el tamaño al no aplicar "compresión" en esos casos. Sin embargo, para no tener realmente un aumento en el tamaño del archivo, debe indicar esto fuera de banda (por ejemplo, en el nombre del archivo).
jeteon
@jeteon No estoy seguro de lo que estás tratando de decir.
oleksii
Solo estaba agregando que dado que siempre tiene la opción de no comprimir la entrada, puede tener un programa de compresión que no comprimirá el archivo en el peor de los casos. Básicamente, si determina que la versión comprimida es más grande que la versión sin comprimir, simplemente la deja. También debería indicar de alguna manera que este es el caso sin aumentar el tamaño de la salida para que el descompresor sepa que el archivo no está comprimido. La única forma de hacerlo sin aumentar el tamaño del archivo es hacer algo como cambiar el nombre del archivo.
jeteon
@jeteon oh, ya veo. Sí, tiene sentido.
oleksii
6

Si el ejecutable original ya estaba comprimido (o contenía datos muy comprimidos o datos no comprimibles), la compresión aumentará el tamaño.

PhonicUK
fuente
2

La mayoría de los algoritmos de compresión usan lo que se llama una tabla de símbolos, básicamente solo partes del archivo que usa como elementos que PUEDE comprimir. Esto, por supuesto, crea algo de sobrecarga en el archivo, pero generalmente resulta en un archivo mucho más pequeño.

En archivos ya comprimidos, todavía crea un conjunto de símbolos, pero hay muy poco que pueda reducir el tamaño. En su caso, la tabla de símbolos del archivo ya comprimido probablemente esté cerca de 2 MB o probablemente más si logró hacer algo de compresión.

Chad Harrison
fuente
0

La idea de compresión:

El software de compresión crea una lista de archivos y elimina el contenido duplicado.

al comprimir archivos ya comprimidos, puede hacer que sus archivos comprimidos sean más grandes que el original.

fromnaboo
fuente