*2020-02-06:00更新 *コメントにあるように、元の結果をgzipで再現することができませんでした。元のクイックテストで誤って別の圧縮形式を使ってしまったと仮定して、gzipを使ってテストを繰り返し、以下の数値を更新しました。この新しい結果は、他の回答やコメントに記載されている理論上の最大圧縮率と一致しています。
圧縮されるデータに大きく依存します。標準バージョンの gzip (デフォルトのオプションを使用するか -9 を指定する) を使用してゼロでいっぱいの 1Gb のファイルを簡単にテストすると、~1018Kb の圧縮サイズが得られるので、10Kb のファイルは ~10Mbytes に拡張される可能性があります。
データの冗長性が低い場合、例えばアーカイブにネイティブに圧縮されている形式 (gif, jpg, png, …) の画像ファイルが含まれている場合、gzip はそれ以上の圧縮を全く行わないかもしれません。プログラムの実行ファイルのようなバイナリファイルの場合、2:1 までの圧縮が見られるかもしれませんが、プレーンテキストや HTML やその他のマークアップの場合は 3:1 や 4:1 以上の圧縮が見られる可能性は低くありません。場合によっては10:1になることもあるかもしれませんが、単一のシンボルで埋め尽くされたファイルで見られる~1030:1は、同様の人為的な状況以外では見られないものです。
非圧縮コンテンツを実際にディスクに書き込まずに gzip ファイルを解凍した結果、どれだけのデータが得られるかは、gunzip -c file.gz | wc --bytes
で確認できます - これはファイルを解凍しますが、結果は保存しません。圧縮されたコンテンツが多数の小さなファイルを含む tar ファイルの場合、完全なアーカイブを解凍するためには、より多くのディスク容量が必要になることに気づくかもしれませんが、ほとんどの状況では、wc
をパイピングして gunzip
を出力して返されるカウントは、必要なだけ正確なものになるでしょう。
引用元: https://stackoverflow.com/a/16794960/293815
デフレート形式の最大圧縮率は1032:1です。これは、符号化できる最長のランが258バイトだからです。このようなランごとに少なくとも2ビット(長さコード用の1ビットと距離コード用の1ビット)が必要であり、したがって、4*258 = 1032の非圧縮バイトを1つの圧縮バイトごとにエンコードすることができます。
gzip の結果を gzip で圧縮することで、より多くの圧縮を得ることができます。通常は圧縮率は向上しませんが、非常に長い時間の実行では圧縮率を向上させることができます。
ところで、deflate が使用している LZ77 のアプローチは、ランレングスエンコーディングよりも一般的です。単なる長さの代わりに、長さと距離のペアが使われます。これにより、ある距離の文字列をコピーして戻したり、ランレングスのようにバイトを1の距離で複製したり、3の距離でバイトの3倍のバイトを複製したりすることができます。
任意の圧縮アルゴリズムの圧縮率は、(そのデータの長さ以外に)圧縮されるデータの関数となります。
MaximumCompression , 複数ファイル圧縮ベンチマークテストのまとめ
File type : Multiple file types (46 in total) # of files to compress in this test : 510 Total File Size (bytes) : 316.355.757 Average File Size (bytes) : 620,305 Largest File (bytes) : 18,403,071 Smallest File (bytes) : 3,554
``` のようなサンプルの一つを見てください。
あなたの質問に対する答えは、入力に依存します。圧縮がどのように行われているかを知るには、この6分間のビデオを見てください。 https://www.youtube.com/watch?v=ZdooBTdW5bM
ここから分かることは、圧縮率は各文字の周波数に依存するということです。