Comprimi file simili in modo efficiente


11

Spesso ho la necessità di comprimere file molto simili tra loro.

Attualmente uso 7Zip, che comprime un file da 16 GB fino a 1,2 GB in circa 35 minuti utilizzando 8 core con impostazioni Ultra.

Mi sembra che gran parte di quel tempo sia impiegato nel calcolo del dizionario da utilizzare per la compressione. Poiché i file sono molto simili, anche il dizionario effettivamente utilizzato è probabilmente simile.

Esiste uno strumento di compressione basato su Windows (7Zip con un'opzione di cui non sono a conoscenza o uno strumento diverso) che può salvare il dizionario e riutilizzare quel dizionario salvato per i file successivi?

Esiste un modo migliore per affrontare il problema di mantenere un rapporto di compressione simile a quello che ho, comprimendo significativamente più velocemente?

Risposte:


5

L' algoritmo di compressione Lempel-Ziv-Welch (LZW) è intrinsecamente intenso dal punto di vista computazionale, con la maggior parte del lavoro stesso che sta effettivamente calcolando il dizionario. Questo è letteralmente come funziona LZW.

L'algoritmo stesso aggiunge una nuova voce del dizionario per ogni "simbolo" successivo che analizza, e quindi durante ogni singola iterazione, una nuova voce viene aggiunta al dizionario. In effetti, il dizionario diventa la copia compressa del file, ed è quindi l' unica cosa che la compressione LZW impiega in primo luogo a dedicare un tempo significativo al calcolo.


Se hai usato qualcosa come la codifica Huffman , il riutilizzo del dizionario sarebbe effettivamente possibile (a scapito di una velocità / dimensione di compressione eventualmente non ottimale). Tuttavia, gli algoritmi e gli strumenti di compressione più moderni utilizzano l'algoritmo LZW per efficienza e velocità (la compressione di Huffman richiederebbe due passaggi sui dati [uno per generare l'albero / tabella di Huffman, un altro per comprimere effettivamente i dati], mentre LZW può essere completato in un singolo passaggio).


1
Con Huffman e un dizionario predefinito, sarebbe necessario un solo passaggio? Esistono strumenti basati su Huffman standard che supportano i dizionari salvati?
Eric J.

@EricJ. sì, con un dizionario predefinito sarebbe la codifica a passaggio singolo. Non conosco nessun software off-hand che possa farlo, anche se ho programmi scritti personalmente che lo fanno. Anche se non l'ho provato, questo strumento sembra che possa fare proprio questo. Tuttavia, basta notare che (di nuovo, a differenza di LZW) per decodificare un bitstream con codifica Huffman, è ancora necessario il dizionario originale per decomprimere i dati.
Breakthrough

In base all'età di quello strumento, immagino sia a thread singolo. Immagino che l'utilizzo di 1 core anziché 8 compenserebbe qualsiasi vantaggio rispetto a un dizionario fisso :-( Avere il dizionario disponibile all'altra estremità è fattibile nel mio scenario (trasferire file di grandi dimensioni tra i data center).
Eric J.

2

A differenza dell'algoritmo DEFLATE, LZMA di 7-Zip utilizza una compressione solida per impostazione predefinita, che sfrutta la ridondanza tra file. Funzionerà con le impostazioni predefinite purché i file siano abbastanza piccoli.

Con le impostazioni predefinite di 2 GB per le dimensioni di Solid Block , un file da 16 GB viene effettivamente compresso come 8 blocchi separati.

Come già detto da @Breakthorugh, il dizionario viene generato al volo. Puoi verificarlo empiricamente impostando le dimensioni di Solid Block su Solido (comprimi tutti i file contemporaneamente) e Non solido (comprimi separatamente ogni file).

L'aumento della dimensione del blocco solido comporterà effettivamente un rallentamento, ma potrebbe comportare un rapporto di compressione molto migliore. Ad esempio, la compressione di due file identici comporterà un archivio quasi due volte più grande con una compressione non solida.


1
Nel mio caso, comprimo i file simili uno alla volta, in diverse occasioni. Esiste solo un file da 16 GB in un determinato archivio.
Eric J.

Ah ok. L'ho interpretato male. I vecchi archivi vengono eliminati quando viene creato quello nuovo? Se no, sarebbe ammissibile archiviare più file in un singolo archivio? Ciò non aiuterà con la velocità di compressione, ma a seconda di quanto siano effettivamente simili i file, potrebbe aiutare con il rapporto.
Dennis,

1
Non importa, non lo fa. L'aggiornamento di un archivio solido richiede molto più tempo, ma non comporta una migliore compressione.
Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.