web-dev-qa-db-ja.com

gzipの最大圧縮率は?

Gzip(例として10kb)の最大サイズはいくらですか?

46
Zombies

圧縮されるデータに大きく依存します。 0でいっぱいの1Gbファイルを使ったクイックテストでは、最大120Kbの圧縮サイズが得られるため、10Kbのファイルを最大85Mバイトに拡張することができます。

データの冗長性が低い場合、たとえばアーカイブにネイティブに圧縮された形式(gif、jpg、png、...)の形式のイメージファイルが含まれている場合、gzipはそれ以上圧縮しない場合があります。プログラム実行可能ファイルのようなバイナリファイルの場合、2:1までの圧縮、プレーンテキスト、HTMLまたはその他の3:1または4:1またはそれ以上のマークアップの場合があります。場合によっては10:1と表示されることがありますが、単一の記号で埋められたファイルで見られる〜8700:1は、同様の人工的な状況の外では見ることができないものです。

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

85
David Spillett

通常、95%以上の圧縮率は得られません(10kBのgzipされたデータは〜200kBまで解凍されます)が、指数関数的に拡大する特別に細工されたファイルがあります。 42.Zipを探してください。数ペタバイト(意味のない)データに展開されます。

10
liori

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

デフレートフォーマットの最大圧縮率は1032:1です。これは、エンコードできる最長のランが258バイトだからです。そのようなラン毎に少なくとも2ビットが必要であり(長さコード用に1ビット、距離コード用に1ビット)、従って1圧縮バイト当たり4×258 = 1032の非圧縮バイトを符号化できる。

あなたはgzipの結果をgzipすることによってより多くの圧縮を得ることができます。通常、それによって圧縮率が向上するわけではありませんが、非常に長い目で見れば可能です。

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

8
ioquatix

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

これは MaximumCompression の分析です。
のようなサンプルを見てください。

複数ファイル圧縮ベンチマークテストのまとめ

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

1つのシンボルしか含まれていない巨大ファイルは非常によく圧縮されます。

4
geek

ファイル内に10 MBのゼロがある場合、gzip -9で10217に圧縮します。したがって、最大比率は約1000倍になります。

4
nikos

あなたの質問に対する答えは、入力によって異なります。圧縮がどのように行われているのかを知るために、この6分間のビデオを見てください。

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

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

1
brunsgaard