gzipの最大圧縮率は?


回答:


91

圧縮されるデータに大きく依存します。ゼロでいっぱいの1Gbファイルを使用した簡単なテストでは、圧縮サイズが〜120Kbになるため、10Kbファイルは〜85Mバイトに拡張される可能性があります。

たとえば、データの冗長性が低い場合、アーカイブにネイティブに圧縮された形式(gif、jpg、png、...)の画像ファイルが含まれている場合、gzipは圧縮をまったく追加しません。プログラム実行可能ファイルなどのバイナリファイルの場合、最大2:1の圧縮が表示される場合があります。プレーンテキスト、HTML、またはその他のマークアップの場合、3:1または4:1以上はまれです。場合によっては10:1が表示されることもありますが、1つのシンボルで満たされたファイルで見られる〜8700:1は、同様の人工的な環境以外では表示されません。

実際に非圧縮コンテンツをディスクに書き込むことなく、gzipファイルを解凍するとどのくらいのデータが生じるかを確認できますgunzip -c file.gz | wc --bytes-これはファイルを圧縮解除しますが、結果を保存せず、代わりに渡すwcとバイト数をカウントしますそれらを破棄します。圧縮されたコンテンツが多くの小さなファイルを含むtarファイルである場合、完全なアーカイブを解凍するために著しく多くのディスク容量が必要になることがわかりますが、ほとんどの場合、gunzip出力のパイピングから返されるカウントはwc必要なだけ正確になります。


HTMLが10倍に拡大するのを見ました(もちろんx3とx4が最も一般的でした!)....おそらく、+ 8倍に爆発するデータには多くの冗長データがあります。問題のページはphp情報ページだったと思います。
ゾンビ

の出力に見られるように、繰り返しマークアップはphpinfo()非常によく圧縮されます。その出力の技術情報には、自然言語の平均的なチャンクよりも直接的な繰り返しが多く含まれており、アルファベットの分布はおそらくスムーズではないため、ハフマンステージでより良い結果を得ることができます。
デビッドスピレット

この回答は考慮しない意図的に悪意が圧縮されたデータ。10KB前後の悪意のあるzipファイルを作成し、4GBを少し超えるサイズまで拡張できます。
デビッドシュワルツ

ただし、その規模のZip爆弾はネストされたアーカイブに依存しているため、人間がファイルを展開すると、やがて奇妙なことに気付くでしょう。ただし、自動化されたスキャナー(メールサービスなど)に対する効果的なDoS攻撃として使用できます。
デビッドスピレット

1
@DavidSpillett:ネストされたzip爆弾はペタバイトの範囲のサイズに拡大します。それは私が話していることではありません。典型的なジップボムの1つのレイヤーだけを見てください。
デビッドシュワルツ

10

通常、95%を超える圧縮は行われません(したがって、10kBのgzip圧縮されたデータは〜200kBに圧縮解除されます)が、指数関数的に拡張する特別に細工されたファイルがあります。を探して42.zip、数ペタバイトの(意味のない)データを解凍します。


4
ウィキペディアによると、 42.zipは「16のセットにネストされたzipファイルの5つのレイヤーを含む」ため、これは解凍の有効な例ではありません(再帰的な解凍のみ)。
Tgr

5
実際、42.zipは、zipファイルを再帰的に自動的にスキャンするツール(ウイルススキャナーなど)にとって特に危険です。
thomasrutter

4
それはgzipではなくzipです
-BeniBela

8

https://stackoverflow.com/a/16794960/293815から逐語的に引用

deflate形式の最大圧縮率は1032:1です。これは、エンコード可能な最長の実行が258バイトであるためです。このような実行ごとに少なくとも2ビット(長さコードに1ビット、距離コードに1ビット)が必要です。したがって、1つの圧縮バイトにつき4 * 258 = 1032の非圧縮バイトをエンコードできます。

gzipの結果をgzipすることで、より多くの圧縮を取得できます。通常、それは圧縮を改善しませんが、非常に長い実行のためにはできます。

ところで、deflateで使用されるLZ77アプローチは、ランレングスエンコーディングよりも一般的です。長さだけでなく、長さ/距離のペアが使用されます。これにより、文字列をある距離からコピーしたり、ランレングスのように1つの距離でバイトを複製したり、3つの距離で3倍のバイトを複製したりできます。


6

圧縮アルゴリズムの圧縮率は、圧縮されるデータの関数になります(そのデータの長さ以外)。

MaximumCompressionでの分析は、次の
ようなサンプルの1つを見てください。

複数ファイル圧縮ベンチマークテストの概要

ファイルの種類:複数のファイルの種類(合計46)  
このテストで圧縮するファイルの数:510  
合計ファイルサイズ(バイト):316.355.757 
平均ファイルサイズ(バイト):620,305
最大ファイル(バイト):18,403,071
最小ファイル(バイト):3,554

4

1つのシンボルのみを含む巨大なファイルは非常によく圧縮されます。


4

ファイル内の10 MBのゼロは、gzip -9で10217に圧縮します。したがって、最大比は約1000倍に見えます。


1

あなたの質問に対する答えは、入力次第です。圧縮がどのように行われるかを知るために、この6分間のビデオをご覧ください。

https://www.youtube.com/watch?v=ZdooBTdW5bM

あなたがそれから得るべきことは、圧縮率が各文字の頻度に依存することであり、したがって、一般的な最大率はなく、入力に依存します。英語のテキストの場合、約65パーセントです。


1
スーパーユーザーへようこそ!リンクされたページが変更されると回答が無効になる可能性があるため、回答の重要な部分を参照リンクから引用してください。
DavidPostill

「各文字の頻度」ではなく「各文字列の頻度」と言う方が正確でしょう。
JoelFan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.