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.