¿Qué hace realmente la combinación de métodos de compresión en 7z?

11

La herramienta de línea de comandos 7z le permite especificar múltiples métodos de compresión , por ejemplo:

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

Todos los métodos se utilizan de alguna manera, o al menos se especifican en los metadatos:

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

No , no aparece para ejecutar el archivo a través de los tres métodos, escoger el mejor. Por el contrario, aparentemente siempre elige el primero, ya que cambiar el orden del método afecta significativamente el tamaño del archivo.

Incluso si agrego varios archivos, como un archivo XML (PPMd produce la mejor compresión) y un archivo binario (LZMA2 sí), todavía enumera todos los métodos para ambos archivos, y no parece cambiar dinámicamente por archivo.

De hecho, la documentación dice específicamente que "puede usar cualquier número de métodos", pero no dice por qué .

Lo que estoy tratando de lograr es un archivo por archivo "pruebe varios métodos, elija el que sea mejor". Por supuesto, puedo lograr esto manualmente con un poco de secuencia de comandos, pero presumiblemente, encadenar los métodos de compresión debería hacer exactamente eso.

Sören Kuklau
fuente
Cambiar el orden de los métodos de compresión debería cambiar el tamaño comprimido incluso si todos los métodos se aplican en secuencia. La mayor parte de la compresión generalmente proviene del primer método aplicado. El resultado de eso generalmente tiene una alta entropía, por lo que es difícil de comprimir aún más. Hay excepciones para las transformaciones que no se espera que compriman los datos por sí mismas, pero que las codifican para que sean más compresibles, por ejemplo, la secuencia 1, 2, 3, 4, 5 no tiene repetición de valores, pero sí repetición de diferencias, por lo que Una transformación delta mejora la compresibilidad. De eso se trata la respuesta de Daniel B.
Steve314
Sin embargo, en realidad no sé qué hace 7zip: solo comentar su lógica "ya que cambiar el orden del método afecta significativamente el tamaño del archivo".
Steve314

Respuestas:

5

En general, los datos comprimidos no se pueden comprimir (más) de manera eficiente. Después de que se haya aplicado el primer método de compresión, el tamaño del archivo no se puede disminuir significativamente.

El -mN=Xes principalmente para el establecimiento de filtros (tomado de archivo de ayuda de Windows):

Filtros soportados:

Filtro Delta Delta ("Es posible configurar el desplazamiento delta en bytes. Por ejemplo, para comprimir archivos WAV estéreo de 16 bits, puede configurar" 0 = Delta: 4 ". El desplazamiento delta predeterminado es 1.")

Convertidor BCJ para ejecutables x86

Convertidor BCJ2 para ejecutables x86 (versión 2) ("BCJ2 es un convertidor de bifurcación para ejecutables x86 de 32 bits (versión 2). Convierte algunas instrucciones de bifurcación para aumentar la compresión".)

Convertidor ARM para ejecutables ARM (little endian)

Convertidor ARMT para ejecutables ARM Thumb (little endian)

Convertidor IA64 para ejecutables IA-64

Convertidor PPC para ejecutables PowerPC (big endian)

Convertidor SPARC para ejecutables SPARC

También del archivo de ayuda, un ejemplo avanzado que aprovecha múltiples flujos de salida del filtro BCJ2:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

agrega archivos * .exe y * .dll al archivo archive.7z usando el convertidor BCJ2, LZMA con un diccionario de 8 MB para el flujo de salida principal (s0) y LZMA con un diccionario de 512 KB para los flujos de salida s1 y s2 de BCJ2.

Daniel B
fuente
"Después de que se haya aplicado el primer método de compresión, el tamaño del archivo no se puede disminuir significativamente". - Por supuesto. Mi esperanza era que especificar múltiples métodos lo haría probar, por archivo , cada método especificado y elegir el más eficiente. Naturalmente, esto haría que la compresión fuera mucho más lenta.
Sören Kuklau
2

Parece que puedes aplicar filtros en una secuencia.

Esta publicación del año pasado tiene una buena explicación:

¿Qué significa el número después del interruptor 7-zip's -m?

Ese número le permite establecer el orden de las operaciones de compresión si está utilizando más de una a la vez.

Este es un ejemplo de la documentación:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

agrega archivos * .exe y * .dll para archivar a.7z usando el filtro BCJ2, LZMA con el diccionario de 32 MB para el flujo de salida principal (s0) y LZMA con el diccionario de 512 KB para los flujos de salida s1 y s2 de BCJ2.

La primera compresión es el número más bajo, que es cero. En este ejemplo, cero se establece en BCJ2. Luego viene uno, que es LZMA. Dos y tres también son LZMA, pero están usando diferentes parámetros d.

La opción -mb se usa para "vincular" la salida de una compresión a la entrada de otra. En este ejemplo, BCJ2 tiene una entrada y cuatro salidas. La salida cero va a la compresión número uno. La salida uno va a la compresión número dos. La salida dos va a la compresión número tres. La salida tres no está vinculada (porque no necesita ser comprimida nuevamente).

Marcelo
fuente