8
votes

Pourquoi GNU serait-il chunk parallèle à améliorer la taille de la compression de GZIP?

fichier sous: "Département d'efficacité imprévu."

Les 90 premiers millions de numéros prennent environ 761 mb, comme sortie par: xxx

selon homme Parallèlement , il peut accélérer l'archivage des gros fichiers d'archivage gzip en coupant l'entrée vers le haut et en utilisant différents processeurs pour comprimer les morceaux. Donc, même si gzip est threaded cette technique le fait multi-filetés : xxx < p> a pris 46 secondes sur un noyau Intel I3-2330m (4) @ 2,2 GHz.

tuyau qui à un ancien gzip : xxx < / Pre>

a pris 80 secondes, sur le même processeur. Maintenant la surprise: xxx

sortie: xxx

300k plus grand? Cela n'a pas l'air bien. D'abord, j'ai vérifié avec zDiff si les fichiers avaient le même contenu - oui, identique. J'aurais supposé tout compresseur ferait mieux avec un flux de données continu que d'un. Pourquoi bigfile2.gz plus petit que bigfile.gz ?


4 commentaires

Fait intéressant sur mon iMac, bigfile2.gz sort plus petit et le temps écoulé est presque identique pour une invocation parallèle et standard.


@Marksetchell pour une raison quelconque de la raison pour laquelle le Mac OS X SEQ ne produit pas la même sortie. Vous pouvez essayer Jot à la place.


Il peut être pertinent de noter que porcz est plus petit et plus rapide que parallèle + gzip (198345773 ici, contre 200381681 à partir de gzip < / CODE> et 52S UTILISATEUR ET 6½S REAL, contre 36½ personnes et réel).


Parallel --Pipe est inefficace. Utilisez parallel --pipepart si possible (ce n'est pas dans ce cas, car vous lisez à partir d'un tuyau, mais vous avez eu un fichier, --PIPEPART serait plus rapide).


3 Réponses :


0
votes

Je pense que c'est la fréquence de la fabrication de dictionnaires, qui est différente. Il s'agit de l'équilibre entre la vitesse et l'efficacité de la compression, comme gzip vs lzma .

Je suppose que c'est plus fréquent dans le cas divisé. Donc, les chiffres du dictionnaire sont plus similaires à ceux suivants.

Il y avait une conférence de 20 minutes sur YouTube , Raul Faille: Comment fonctionne Gzip Compression | JSCONF UE 2014 .


1 commentaires

Re: "Ce qui suit." Il n'est pas trop clair ce que Noun-Object the suivant signifie. Désolé, mais la conférence Raul Faille, livrée avec un accent épais de l'Espagne dans une monotone timide molle par un auto-expert non expert en compression, est trop lent pour mes oreilles américaines habituées à des bavards rapides - il serait préférable de simplement citer le Une partie que vous pensez est pertinente ou de lien vers le segment le plus pertinent de la vidéo.



8
votes

La raison en est que, pour cette entrée plutôt inhabituelle, des blocs de déflèvement plus petits sont meilleurs que les plus grands. Par défaut gzip utilise des blocs de déflèvements plus importants, car cela fonctionne mieux pour les données d'entrée normales. La commande parallèle forçant quelques blocs de déflèvements plus petits en rompant l'entrée toutes les 1 Mo, entraînant un petit gain. Bien que la plupart des blocs sont toujours de la même taille.

Vous pouvez faire beaucoup mieux en définissant une plus petite taille de bloc pour chaque bloc en utilisant zlib 'S MEMLEVEL paramètre dans déflateinit2 () . Ici, je compresse la même sortie dans un seul fil à chaque fois, à l'aide des valeurs MEMLEVEL de 9 à 2, où un plus petit> MEMLEVEL est une taille de bloc de déformation inférieure (notez que zlib. Un peu mieux que votre gzip au niveau par défaut):


7 commentaires

Juste pour être clair, le zlib MEMLEVEL 2-9 Les options sont pas identique à la gzip Vitesse de compression 'S - # ( 1-9 ) options, correct?


Correct. Le 1-9 est un niveau de compression, qui contrôle la dureté du compresseur des chaînes assorties. En fait, pour cette entrée, le niveau par défaut de 6 comprime mieux que 9! Mais c'est une histoire pour une autre fois.


Quelque chose à propos de ce type de données fait mieux 1023 symboles. Un réglage à grain finirait-il (disons 1013 symboles, etc.) compressez-vous à un optimum plus petit? Le 1023 est également constitué de la taille de la taille du jeu de données, c'est-à-dire 1023 symboles restent optimaux s'il y avait 9 millions de chiffres, ou 900 millions? Réponse: Test des valeurs plus petites que 90 mil., 9mil., 900k, 90k: parallèle semble généralement faire un peu mieux que gzip . 900 mil. donne également parallèle la victoire mineure.


Vous pouvez faire mieux avec une taille de bloc plus petite, si moins de commandes distinctes ont été utilisées. J'imaginais de construire un flux dégonflé à la main pour ces données, et il aurait de très petits blocs avec un numéro pour introduire chaque nouvelle séquence d'un nombre de 1000 numéros, puis un bloc avec juste des correspondances pour les 999 autres. Voir ma note sur zopfli , qui a optimisé cela. Je vérifierai plus tard quelle est la taille de bloc qu'elle utilisait.


Du parallèle a une option -Block , qui définit la taille du morceau. Test sur une liste de 90000 (demi-mégot de données), la meilleure taille de bloc de la compression est d'environ 1024 octets, mais la surcharge pour parallèle s parallèle et ce que cela fait qu'il faut 40 fois plus longtemps.


En fait, c'est très intéressant. Il est probablement possible de recompresser 9 * 9 fois et de voir quel est le meilleur résultat ...


@Shimondoodkin va pour ça.



0
votes

L'effet est probablement dû à la taille du bloc de compression. Compression du même flux d'entrée avec une plage de paramètres tels que ceci:

-rw-r--r-- 1 203473375 Jul  4 16:39 1.gz
-rw-r--r-- 1 201160853 Jul  4 16:40 2.gz
-rw-r--r-- 1 200181562 Jul  4 16:40 3.gz
-rw-r--r-- 1 204266147 Jul  4 16:40 4.gz
-rw-r--r-- 1 199144028 Jul  4 16:40 5.gz
-rw-r--r-- 1 199688429 Jul  4 16:40 6.gz
-rw-r--r-- 1 199689546 Jul  4 16:41 7.gz
-rw-r--r-- 1 200376213 Jul  4 16:41 8.gz
-rw-r--r-- 1 200381681 Jul  4 16:42 9.gz


4 commentaires

Non, ce n'est pas l'effet ici. Le niveau de compression n'est pas changé. En outre, le niveau de compression ne change pas la taille du bloc. Vous voyez encore un autre effet, qui est le niveau de compression plus élevé qui trouve des correspondances plus longues, mais cette amélioration étant contré par un plus grand nombre de longueurs et de distances distinctes, nécessitant plus de bits par correspondance au code.


Je pensais que le programme GZIP a changé la taille du bloc lorsqu'il définit le niveau de compression, mais je suis maintenant corrigé. Merci @mark pour me corriger!


Trivia: Direction de 15 minutes de CPU faisant un parallèle comparatif vs plaine gzip table, temps pour F in {1..9}; echo $ f "" $ (SEQ 90000000 | gzip - $ f | wc -c) "" $ (SEQ 90000000 | parallèle --Pipe --Recend '' -k gzip - $ f | wc -c); FAIRE , révèle que la nature gzip est un peu plus petit pour -1 via -3 et plus grand par la suite. parallèle atteint son minimum avec gzip -5 à 198735045 octets.


Plus de trivia: Ajout de porcz à cette boucle, $ (SEQ 90000000 | PIGZ - $ F | WC -C) , montre que c'est Sweet Spot est également -5 < / code> à 197271587 octets. PIGZ est le plus petit à chaque fois, sauf pour -2 où il se trouve en 2e place après gzip .