Supporto multithread in 7za


18

(L'ho pubblicato prima su serverfault, ma poi ho capito che probabilmente appartiene qui.)

Sto provando a comprimere un file di testo molto grande usando 7za (p7zip) 9.20. L'opzione -mmt non sembra avere alcun effetto. Ho provato entrambi -mmt = on e -mmt = 2. Questa è una macchina a 8 core. Una persona ha suggerito di aggiungere -m0 = lzma2 come argomento, ma questo mi dà solo E_INVALIDARG. Qualcuno sa come farlo funzionare?

Questo non ha alcun effetto:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

E questo non riesce con un errore:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG

Credo che l'opzione sia semplicemente -mmtno -mmt=2. Inoltre credo che sia la sintassi corretta -mx9, sebbene entrambi potrebbero funzionare.
Breakthrough

Grazie, ma -mmt senza un'opzione usa ancora solo un thread. Secondo docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , puoi specificare il numero di thread da usare con, -mmt = N.
Brian L

Consiglierei comunque di usare LZMA / Deflate anche se è solo a thread singolo. Mentre potresti ottenere una maggiore velocità di compressione con BZip2, è meno efficiente quando comprime il testo normale e le varianti a thread singolo sono più lente rispetto agli equivalenti LZMA / Deflate.
Breakthrough

@Breakthrough: BZip2 di solito ottiene una compressione migliore di DEFLATE, come mostrato nel tuo link. È anche molto, molto più veloce di LZMA (durante la compressione).
Dennis,

Risposte:


25

Secondo l' opzione -m (Imposta metodo di compressione) switch # ZipMultiThread - 7ZIP manuale e documentazione , mtimpostazione predefinita su on, quindi non è necessario specificarlo affatto.

Tuttavia, l'implementazione di 7zip dell'algoritmo DEFLATE non supporta il multi-threading!

Come hai già scoperto,

7za a archive.zip bigfile

utilizza solo un core.

Ma i .zipfile comprimono ogni file singolarmente. Quando si comprimono più file, l'opzione multi-thread comprime un file per core alla volta.

Provalo e lo vedrai

7za a archive.zip bigfile1 ... bigfileN

utilizzerà tutti i Ncore disponibili .

Se vuoi velocizzare la compressione di un singolo file, hai due possibilità:

  1. Suddivisi bigfilein pezzi.

  2. Utilizzare un diverso algoritmo di compressione.

    Ad esempio, l'implementazione di 7zip dell'algoritmo BZip2 supporta il multi-threading.

    La sintassi è:

    7za a -mm=BZip2 archive.zip bigfile
    

Inoltre, l'errore di sintassi è causato dal tentativo di utilizzare l'algoritmo LZM per un .zipcontenitore. Non e possibile.

I possibili algoritmi per i .zipconatiner sono DEFLATE (64), BZip2 e nessuna compressione.

Se si desidera utilizzare l'algoritmo LZM, utilizzare un .7zcontenitore. Questo contenitore gestisce anche i seguenti algoritmi: PPMd, BZip2, DEFLATE, BCJ, BCJ2 e nessuna compressione.


@Dennis Pensavo che l'OP stesse usando LZMA (2), che dalla documentazione "La compressione LZMA utilizza solo 2 thread". Sebbene sia d'accordo, intuitivamente (a causa del modo in cui funziona la codifica Lempel-Ziv ), sarebbe molto difficile multithreading LZMA o Deflate (che è solo LZMA con codifica Huffman).
Breakthrough

1
@Breakthrough: All'inizio, anche io. (Dai un'occhiata alle revisioni della mia risposta.) Ecco di cosa si trattava l'errore di sintassi. Non è possibile utilizzare la compressione LZMA con un .zipcontenitore.
Dennis,

@Dennis ah, grazie per avermi chiarito. Non ho visto che l'OP stava usando un .ZIPcontainer.
Breakthrough

Aspetta, quindi otterrò un risultato diverso se cambio semplicemente l'estensione del file in .7z?
Brian L

3
@BrianL c'è un pulsante "grazie" incorporato. Sembra una freccia rivolta verso l'alto;)
nhinkle

5

Questa è una vecchia domanda, non la risposta alla domanda specifica, ma una risposta allo spirito della domanda (Usare tutti i core per comprimere un formato zip)

pigz (gzip parallelo con opzione .zip)

pigz -K -k archive.zip bigfile txt

Questo ti darà un file zip compatibile 7 volte più veloce per lo stesso livello di compressione.

Un rapido confronto di compressori compatibili con zip e non zip utilizzando core singoli e multipli.

tempi di wall su i7-2600k per comprimere file txt da 1,0 gb su fedora 20

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

tempi di muro per decomprimere

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d

perché pigz quando puoi pbzip2 o pixz?
annuisce il

gzip è molto, molto più veloce di bzip2, quindi la compressione extra non ne vale sempre la pena.
jesjimher,

0

Usa -mmt [N + 1]

Ad esempio: -mmt2 è per un thread, -mmt9 è per otto thread


-1

Verificato e testato: per utilizzare il multithreading su 7za il parametro deve essere "-mmt #" non "-mmt = #", mettendo il segno uguale lo fa ignorare.

Come l'avevo scoperto? Dopo aver eseguito 7z senza alcun parametro, mostra le informazioni sui parametri, sugli switch dice "-mmt [N]", non "-mmt = [N]"

Quindi, se ho capito bene, il parametro che stai digitando "-mmt = 2" potrebbe essere errato e potrebbe essere "-mmt2", senza il segno di uguale.

Non sono sicuro che se ho capito bene, il mio inglese è davvero scadente.

A proposito, perché usi "7za" invece di "7z"?

Quindi, per testare il parametro, eseguo una serie di comandi per eseguire benchmark e questo ha confermato l'errore di battitura su alcuni documenti. È necessario digitare il parametro corretto senza il segno di uguale.

Comando per fare un benchmark con 7z con un solo thread: 7z b -mmt1

Comando per fare un benchmark con 7z con solo due thread: 7z b -mmt2

Comando per fare un benchmark con 7za con solo due thread: 7za b -mmt2

Comando per fare un benchmark con 7za con un solo thread: 7za b -mmt1

Non esiste un segno uguale sul parametro ˋ-mmt # ˋ, né per 7z, né per 7za.

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.