Comprima archivos similares de manera eficiente

11

Con frecuencia tengo la necesidad de comprimir archivos que son muy similares entre sí.

Actualmente uso 7Zip, que comprime un archivo de 16GB a 1.2GB en aproximadamente 35 minutos usando 8 núcleos con configuraciones Ultra.

Me parece que gran parte de ese tiempo se dedica a calcular el diccionario para usarlo en la compresión. Dado que los archivos son muy similares, el diccionario realmente utilizado también es similar.

¿Existe una herramienta de compresión basada en Windows (7Zip con una opción que desconozco, o una herramienta diferente) que pueda guardar el diccionario y reutilizar ese diccionario guardado para archivos posteriores?

¿Hay una mejor manera de abordar el problema de mantener una relación de compresión similar a la que tengo, mientras se comprime significativamente más rápido?

Eric J.
fuente

Respuestas:

5

El algoritmo de compresión Lempel-Ziv-Welch (LZW) es inherentemente computacionalmente intensivo, y la mayoría del trabajo en sí mismo es en realidad calcular el diccionario. Esto es literalmente cómo funciona LZW.

El algoritmo mismo agrega una nueva entrada de diccionario para cada próximo "símbolo" que escanea y, por lo tanto, durante cada iteración, se agrega una nueva entrada al diccionario. En efecto, el diccionario se convierte en la copia comprimida del archivo y, por lo tanto, en realidad es lo único que la compresión LZW dedica un tiempo significativo a la computación en primer lugar.


Si utilizó algo como la codificación Huffman , la reutilización del diccionario sería posible (a expensas de una tasa / tamaño de compresión posiblemente subóptima). Sin embargo, la mayoría de los algoritmos y herramientas de compresión modernos utilizan el algoritmo LZW para eficiencia y velocidad (la compresión de Huffman requeriría dos pases sobre los datos [uno para generar el árbol / tabla de Huffman, otro para comprimir los datos], mientras que LZW puede completarse en Un solo pase).

Penetración
fuente
1
Con Huffman y un diccionario predefinido, ¿se requeriría una sola pasada? ¿Existen herramientas comerciales basadas en Huffman que admitan diccionarios guardados?
Eric J.
@EricJ. Sí, con un diccionario predefinido sería una codificación de un solo paso. No conozco ningún software que pueda hacer esto, aunque personalmente he escrito programas que lo hacen. Si bien no lo he probado, parece que esta herramienta puede hacer exactamente eso. Sin embargo, solo tenga en cuenta que (nuevamente, a diferencia de LZW) para decodificar un flujo de bits codificado por Huffman, aún necesita el diccionario original para descomprimir los datos.
Avance
Según la antigüedad de esa herramienta, supongo que es de un solo subproceso. Supongo que usar 1 núcleo en lugar de 8 compensaría cualquier beneficio de un diccionario fijo :-( Tener el diccionario disponible en el otro extremo es factible en mi escenario (transferir archivos grandes entre centros de datos).
Eric J.
2

A diferencia del algoritmo DEFLATE, el LZMA de 7-Zip utiliza una compresión sólida de forma predeterminada, que aprovecha la redundancia entre archivos. Esto funcionará con la configuración predeterminada siempre que los archivos sean lo suficientemente pequeños.

Con la configuración predeterminada de 2 GB para el tamaño de bloque sólido , un archivo de 16 GB se comprime en realidad como 8 fragmentos separados.

Como ya dijo @Breakthorugh, el diccionario se genera sobre la marcha. Puede verificar esto empíricamente estableciendo el tamaño de bloque sólido en sólido (comprima todos los archivos a la vez) y no sólido (comprima cada archivo por separado).

Aumentar el tamaño del bloque sólido en realidad resultará en una desaceleración, pero puede resultar en una relación de compresión mucho mejor. Por ejemplo, comprimir dos archivos idénticos dará como resultado un archivo casi el doble de grande con una compresión no sólida.

Dennis
fuente
1
En mi caso, comprimo los archivos similares uno a la vez, en diferentes ocasiones. Solo hay un archivo de 16GB-ish en un archivo dado.
Eric J.
Ah ok. Lo malinterpreté. ¿Se eliminan los archivos antiguos cuando se crea el nuevo? Si no, ¿sería admisible almacenar varios archivos en un solo archivo? Eso no ayudará con la velocidad de compresión, pero dependiendo de cuán similares sean realmente los archivos, podría ayudar con la relación.
Dennis
1
No importa, no lo hace. Actualizar un archivo sólido lleva mucho más tiempo, pero no resulta en una mejor compresión.
Dennis