Cosa fa effettivamente combinando i metodi di compressione in 7z?


11

Lo strumento da riga di comando 7z consente di specificare più metodi di compressione , ad esempio:

# 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

Tutti i metodi vengono utilizzati in qualche modo, o almeno specificato nei metadati:

$ 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

Essa non sembra eseguire il file attraverso tutti e tre i metodi, raccogliendo il meglio. Piuttosto, apparentemente sceglie sempre il primo, poiché la modifica dell'ordine del metodo influisce in modo significativo sulla dimensione del file.

Anche se aggiungo più file, ad esempio un file XML (PPMd produce la migliore compressione) e un file binario (LZMA2 fa), elenca comunque tutti i metodi per entrambi i file e non sembra cambiare dinamicamente per file.

In effetti, la documentazione specifica che "È possibile utilizzare qualsiasi numero di metodi", ma non dice per quale motivo .

Quello che sto cercando di ottenere è un archivio "prova più metodi, scegli quello che è meglio" per file. Ovviamente posso farlo manualmente con un po 'di scripting, ma presumibilmente, concatenare i metodi di compressione dovrebbe fare esattamente questo?


Cambiando l'ordine dei metodi di compressione dovrebbe cambiare il formato compresso, anche se tutti i metodi sono applicati in sequenza. La maggior parte della compressione deriva in genere dal primo metodo applicato. Il risultato da ciò ha tipicamente un'entropia elevata, quindi è difficile comprimerlo ulteriormente. Ci sono eccezioni per le trasformazioni che non dovrebbero comprimere i dati stessi, ma che lo codificano per essere più comprimibili - ad esempio la sequenza 1, 2, 3, 4, 5 non ha ripetizione di valori, ma ha ripetizione di differenze, quindi una trasformazione delta migliora la compressibilità. Questa è la risposta di Daniel B.
Steve314,

In realtà non so cosa faccia 7zip, solo commentando la tua logica "poiché cambiare l'ordine del metodo influisce significativamente sulla dimensione del file".
Steve314,

Risposte:


5

In generale, i dati compressi non possono essere compressi (ulteriormente) in modo efficiente. Dopo aver applicato il primo metodo di compressione, la dimensione del file non può essere ridotta in modo significativo.

Il -mN=Xè principalmente per specificare filtri (presi da file di help di Windows):

Filtri supportati:

Filtro Delta Delta ("È possibile impostare l'offset delta in byte. Ad esempio, per comprimere i file WAV stereo a 16 bit, è possibile impostare" 0 = Delta: 4 ". L'offset delta predefinito è 1.")

Convertitore BCJ per eseguibili x86

Convertitore BCJ2 per eseguibili x86 (versione 2) ("BCJ2 è un convertitore Branch per eseguibili x86 a 32 bit (versione 2). Converte alcune istruzioni del ramo per aumentare ulteriormente la compressione.")

Convertitore ARM per eseguibili ARM (little endian)

Convertitore ARMT per eseguibili ARM Thumb (little endian)

Convertitore IA64 per eseguibili IA-64

Convertitore PPC per eseguibili PowerPC (big endian)

Convertitore SPARC per eseguibili SPARC

Sempre dal file della guida, un esempio avanzato che sfrutta più flussi di output 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

aggiunge i file * .exe e * .dll all'archivio archive.7z utilizzando il convertitore BCJ2, LZMA con dizionario da 8 MB per il flusso di output principale (s0) e LZMA con dizionario da 512 KB per i flussi di output s1 e s2 di BCJ2.


"Dopo l'applicazione del primo metodo di compressione, la dimensione del file non può essere ridotta in modo significativo." - Sicuro. La mia speranza era che la specificazione di più metodi facesse provare, per file , ogni metodo specificato e scegliere il più efficiente. Naturalmente, ciò renderebbe la compressione molto più lenta.
Sören Kuklau,

2

Sembra che tu possa applicare i filtri in una sequenza.

Questo post dell'anno scorso ha una bella spiegazione:

Cosa significa il numero dopo l'opzione -m di 7-zip?

Tale numero consente di impostare l'ordine delle operazioni di compressione se ne si utilizza più di una alla volta.

Questo è un esempio dalla documentazione:

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

aggiunge i file * .exe e * .dll per archiviare a.7z utilizzando il filtro BCJ2, LZMA con dizionario da 32 MB per il flusso di output principale (s0) e LZMA con dizionario da 512 KB per i flussi di output s1 e s2 di BCJ2.

La prima compressione è il numero più basso, che è zero. In questo esempio, zero è impostato su BCJ2. Poi ne arriva uno, che è LZMA. Due e tre sono anche LZMA, ma utilizzano parametri d diversi.

L'opzione -mb viene utilizzata per "associare" l'output da una compressione all'input di un'altra. In questo esempio, BCJ2 ha un input e quattro output. L'uscita zero sta per la compressione numero uno. L'uscita uno sta per la compressione numero due. L'uscita due va al numero di compressione tre. L'output tre non è associato (perché non deve essere nuovamente compresso).

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.