Prise en charge multithread dans 7za

18

(J'ai d'abord posté ceci sur serverfault, mais je me suis alors rendu compte qu'il appartenait probablement ici.)

J'essaie de compresser un très gros fichier texte en utilisant 7za (p7zip) 9.20. L'option -mmt ne semble pas avoir d'effet. J'ai essayé à la fois -mmt = on et -mmt = 2. Il s'agit d'une machine à 8 cœurs. Une personne a suggéré d'ajouter -m0 = lzma2 comme argument, mais cela me donne juste E_INVALIDARG. Quelqu'un sait-il comment faire fonctionner cela?

Cela n'a aucun effet:

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

Et cela échoue avec une erreur:

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
Brian L
la source
Je crois que l'option est tout simplement -mmtnon -mmt=2. Je crois également que la syntaxe appropriée est -mx9, bien que les deux puissent fonctionner.
Percée du
Merci, mais -mmt sans option utilise toujours un seul thread. Selon docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , vous pouvez spécifier le nombre de threads à utiliser avec, -mmt = N.
Brian L
Je recommanderais toujours d'utiliser LZMA / Deflate même s'il ne s'agit que d'un seul thread. Bien que vous puissiez obtenir une vitesse de compression accrue avec BZip2, il est moins efficace lors de la compression de texte brut et les variantes à un seul thread sont plus lentes que les équivalents LZMA / Deflate.
Percée du
@Breakthrough: BZip2 obtient généralement une meilleure compression que DEFLATE, comme indiqué dans votre lien. C'est aussi beaucoup, beaucoup plus rapide que LZMA (lors de la compression).
Dennis

Réponses:

25

Selon -m (Set compression Method) switch # ZipMultiThread - 7ZIP manual & documentation , par mtdéfaut on, il n'est donc pas nécessaire de le spécifier du tout.

Cependant, l'implémentation 7zip de l'algorithme DEFLATE ne prend pas en charge le multithread!

Comme vous l'avez déjà découvert,

7za a archive.zip bigfile

n'utilise qu'un seul noyau.

Mais les .zipfichiers compressent chaque fichier individuellement. Lors de la compression de plusieurs fichiers, l'option multithread compresse un fichier par cœur à la fois.

Essayez-le et vous verrez que

7za a archive.zip bigfile1 ... bigfileN

utilisera tous les Ncœurs disponibles .

Si vous souhaitez accélérer la compression d'un seul fichier, vous avez deux choix:

  1. Séparez-vous bigfileen morceaux.

  2. Utilisez un algorithme de compression différent.

    Par exemple, l'implémentation 7zip de l'algorithme BZip2 prend en charge le multithread.

    La syntaxe est:

    7za a -mm=BZip2 archive.zip bigfile
    

En outre, l'erreur de syntaxe est provoquée par votre tentative d'utilisation de l'algorithme LZM pour un .zipconteneur. Ce n'est pas possible.

Les algorithmes possibles pour les .zipconatiners sont DEFLATE (64), BZip2 et aucune compression.

Si vous souhaitez utiliser l'algorithme LZM, utilisez un .7zconteneur. Ce conteneur gère également les algorithmes suivants: PPMd, BZip2, DEFLATE, BCJ, BCJ2 et aucune compression.

Dennis
la source
@Dennis Je pensais que l'OP utilisait LZMA (2), qui d'après la documentation, "La compression LZMA utilise seulement 2 threads." Bien que je sois d'accord, intuitivement (en raison de la façon dont fonctionne l' encodage Lempel-Ziv ), il serait très difficile de multithread LZMA ou Deflate (qui est juste LZMA avec l'encodage Huffman).
Percée du
1
@Breakthrough: Au début, moi aussi. (Consultez les révisions de ma réponse.) C'est de cela qu'il s'agissait. Vous ne pouvez pas utiliser la compression LZMA avec un .zipconteneur.
Dennis
@Dennis ah, merci d'avoir clarifié cela. Je n'ai pas vu que l'OP utilisait un .ZIPconteneur.
Percée du
Attendez, donc j'obtiendrai un résultat différent si je change simplement l'extension de fichier du conteneur en .7z?
Brian L
3
@BrianL il y a un bouton "merci" intégré. Il ressemble à une flèche orientée vers le haut;)
nhinkle
5

Ceci est une vieille question, et non la réponse à la question spécifique, mais une réponse à l'esprit de la question (Utiliser tous les cœurs pour compresser un format zip)

pigz (gzip parallèle avec option .zip)

pigz -K -k archive.zip bigfile txt

Cela vous donnera un fichier compatible zip 7 fois plus rapide pour le même niveau de compression.

Une comparaison rapide des compresseurs compatibles zip et non zip utilisant des noyaux simples et multiples.

temps de mur sur i7-2600k pour compresser un fichier txt de 1,0 Go sur 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)

temps de décompression des murs

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d
tgeorge
la source
pourquoi pigz quand on peut pbzip2 ou pixz?
hocher la tête du
gzip est beaucoup, beaucoup plus rapide que bzip2, donc la compression supplémentaire n'en vaut pas toujours la peine.
jesjimher
0

Utilisez simplement -mmt [N + 1]

Par exemple: -mmt2 est pour un thread, -mmt9 est pour huit threads

acubed
la source
-1

Vérifié et testé: Pour utiliser le multithreading sur 7za, le paramètre doit être "-mmt #" et non "-mmt = #", mettre le signe égal le fait ignorer.

Comment je l'avais découvert? Après avoir exécuté 7z sans aucun paramètre, il affiche les informations sur les paramètres, sur les commutateurs, il dit "-mmt [N]", pas "-mmt = [N]"

Donc, si je comprends bien, le paramètre que vous tapez "-mmt = 2" peut être mal écrit et peut être "-mmt2", sans le signe égal.

Je ne sais pas si je comprends bien, mon anglais est vraiment médiocre.

Au fait, pourquoi utiliser "7za" au lieu de "7z"?

Donc, pour tester le paramètre, j'exécute un ensemble de commandes pour faire des tests de performance et cela a confirmé l'erreur de frappe sur certains documents. Le paramètre correct doit être saisi sans le signe égal.

Commande pour faire un benchmark avec 7z avec un seul thread: 7z b -mmt1

Commande pour faire un benchmark avec 7z avec seulement deux threads: 7z b -mmt2

Commande pour faire un benchmark avec 7za avec seulement deux threads: 7za b -mmt2

Commande pour faire un benchmark avec 7za avec un seul thread: 7za b -mmt1

Il n'y a pas de signe égal sur le paramètre ˋ-mmt # ˋ, ni pour 7z, ni 7za.

Laura
la source