2016-07-04 5 views
7

下のファイル:「Unexpected Efficiency Dept」 man parallelによると、それはgzipさんがに異なるCPUを入力を切り刻んで大きなファイルをアーカイブし、使用してスピードアップすることができますgnuの並列チャンクがgzipの圧縮サイズを改善するのはなぜですか?

seq 90000000 

最初9000万数字がで出力として、761メガバイトについて取り上げますチャンクを圧縮する。だから、gzipはこの技術シングルスレッドであっても、それマルチスレッドます:

seq 90000000 | parallel --pipe --recend '' -k gzip -9 >bigfile.gz 

2.2GHzの@(4)インテルCore i3-2330Mに、46秒を要しました。

seq 90000000 | gzip -9 > bigfile2.gz 

が同じCPU上で、80秒を要した:昔ながら gzip

パイプ。今驚き:

ls -log bigfile*.gz 

出力:

-rw-rw-r-- 1 200016306 Jul 3 17:27 bigfile.gz 
-rw-rw-r-- 1 200381681 Jul 3 17:30 bigfile2.gz 

300Kより大きい?それは正しく見えませんでした。最初に、ファイルに同じ内容がある場合はzdiffとチェックしました。私は、コンプレッサーは、チャンクされたものよりも連続したデータストリームでうまくいくと思います。 bigfile2.gzbigfile.gzより小さいのはなぜですか?

+0

興味深いことに、私のiMacでは、 'bigfile2.gz'が小さくなり、経過時間は並列呼び出しと標準呼び出しでほぼ同じになります。 –

+1

@ MarkSetchell何らかの理由で、Mac OS Xの 'seq'は同じ出力を生成しません。代わりに 'jot'を試すことができます。 –

+1

'pigz'は' parallel' + 'gzip'(ここでは198345773、gzipでは200381681、userは52分、realは6分の1、userとrealは36分の1)よりも小さくて速いことに注意してください。 –

答えて

7

なぜなら、この特定の、むしろ珍しい入力では、より小さな収縮ブロックがより大きな収束ブロックよりも優れているからです。デフォルトではgzipは通常の入力データに最も適しているので、より大きなデフレートブロックを使用します。パラレルコマンドは、1 MBごとに入力を分割することにより、少数の小さなデフレートブロックを強制し、結果として小さなゲインをもたらします。ほとんどのブロックはまだ同じサイズですが。

あなたはdeflateInit2()zlibmemLevelパラメータを使用してすべてのブロックのための小さなブロックサイズを設定することにより、より良い行うことができます。ここでは、同じ出力を1つのスレッドで毎回圧縮し、memLevelの値を9から2に変更します。ここでは、より小さい数字のmemLevelは、より小さなデフレートブロックサイズです(zlibはデフォルトレベルのgzipより少し良いです)。

  • 9から199688429
  • 8から198554111(デフォルト)
  • 7から191582070
  • 6から184880482
  • 5から181295029
  • 4 - (この入力のために最適)180137425圧縮されたデータは、8のデフォルトmemLevelよりも小さい12メガバイト(9%)であるため185759115

このデータのために最適memLevelは4であることが判明、 -

  • 3から181176610
  • 8の場合、デフレートブロックサイズは16383シンボルであり、 memLevel 4の場合、デフレートブロックサイズは1023シンボルです。 1つのシンボルはリテラルバイトかマッチです。

    この改善は、入力の非常に規則的な性質からもたらされ、一致とリテラルコマンドの規則的なシーケンスをもたらす。ブロックサイズが小さくなればなるほど、そのような別個のコマンドが少なくなり、各コマンドをコーディングするのに必要なビット数が少なくなります。これはまだmemLevel 3に当てはまりますが、それまでに各deflateブロックの先頭にあるコード記述のオーバーヘッドにより、少数の異なるコードからの改善が取り消されます。

    zopfliは、ブロックサイズと選択したコマンドを最適化し、100,656,812バイトに圧縮するための圧縮されたコンプレッサです。しかし3時間半かかりました! zopfliは、圧縮レベル11を使用してpigzで呼び出されます。

    +0

    ** zlib ** 'memlevel' * 2-9 *オプションは' gzip'の圧縮速度 ' - #'(* 1-9 *)オプションと同じですか? – agc

    +1

    正しい。1-9は圧縮レベルで、コンプレッサーが一致する文字列をどれだけ激しく検索するかを制御します。実際、この入力の場合、デフォルトのレベル6は9より良い圧縮です!しかしそれは別の時代の話です。 –

    +0

    このタイプのデータに関する何かが1023シンボルをより良くします。より細かい粒度の設定(1013シンボルなど)が、より小さい最適値に圧縮されますか?また、データセットの*サイズ*に特有の1023もあります。つまり、900万の数字がある場合、1023シンボルが最適な状態になりますか?答え:90 mil、9 mil、900 K、90 Kより小さい値をテストする: 'parallel'は一般的に' gzip'よりやや良いようです。 900ミル。また、マイナーな勝利を '平行に '与える。 – agc

    0

    辞書作成の頻度が違うと思います。 これは、速度と圧縮効率のバランスです。例えば、gzip vs lzmaのようになります。

    私は分割ケースでより頻繁になると思います。 辞書の番号は次のようになります。

    Raul Fraile: How GZIP compression works | JSConf EU 2014に20分の講義がありました。

    +0

    Re: "次のとおりです。" *以下の*が意味する名詞オブジェクトがどんなものであるかはあまり明確ではありません。申し訳ありませんが、Raul Fraileの講義は、圧倒的な自信を持って非公式の圧縮で臆病なソフトモノトーンでスペイン語のアクセントを付け加えたものですが、スピーカーに慣れているアメリカの耳にとっては遅すぎます。関連性があると思われる部分、または動画の最も関連性の高い部分にのみリンクします。 – agc

    0

    圧縮ブロックサイズが原因である可能性があります。このような設定の範囲と同じ入力ストリームを圧縮:-6gzipのデフォルトオフ遠くありません

    -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 
    

    for i in {1..9}; do seq 90000000 | gzip -$i >$i.gz; done 
    

    gzip -5で最低値に達するファイルサイズを与えます。

    +1

    いいえ、それはここでは効果がありません。圧縮レベルは変更されていません。さらに、圧縮レベルはブロックサイズを変更しません。より長い圧縮レベルではより長い一致を見つけることができますが、より多くの異なる長さと距離によって改善され、コードごとに一致するビット数が増えます。 –

    +0

    圧縮レベルを設定すると、gzipプログラムがブロックサイズを変更したと思っていましたが、修正されました。ありがとう@私を修正するためのマーク! –

    +0

    トリビア:15分のCPUを無駄にして、比較の 'parallel'対plain' gzip'テーブルを作る、 '{1..9}のfの時間; echo $ f "" $(seq 90000000 | gzip - $ f | wc -c) "" $(seq 90000000 | parallel - pipe --recend '' -k gzip-$ f | wc -c); done 'は '' gzip''が '-1'から' -3'までは少し小さく、その後は大きくなることを示しています。 'parallel'は* 198735045 *バイトで' gzip -5'で最小値に達します。 – agc

    関連する問題