web-dev-qa-db-ja.com

達成できるランダムバイナリデータの最良のファイル圧縮は何ですか?

具体的には、どのプログラムが存在し、最高の圧縮率を持つのは何ですか?私はそれをグーグルで試しましたが、経験が検索結果に勝ると思われるので、お願いします。

36
ox_n

任意のファイルサイズNに対して、ビットに対して正確なファイルサイズを指定できる場合、Nビット以下の2 ^(N + 1)-1個の可能性のあるファイルが正確に存在します。サイズXのファイルを小さなサイズYにマップするには、サイズY以下のファイルをサイズX以上のファイルにマップする必要があります。ロスレス圧縮が機能する唯一の方法は、可能性のあるファイルが他のファイルよりも可能性が高いと識別できる場合です。そのシナリオでは、ありそうなファイルは縮小され、ありそうもないファイルは大きくなります。

簡単な例として、ビットがランダムで独立したファイルを可逆的に保存したいが、ビットの50%が設定されているのではなく、33%だけが保存されているとします。ビットの各ペアを取り、両方のビットがクリアの場合は「0」、最初のビットが設定されている場合は「10」、2番目のビットが設定されていない場合は「110」、最初のビットが設定されていない場合は「110」を書き込むことで、このようなファイルを圧縮できます、または両方のビットが設定されている場合は「111」。効果は、各ビットのペアが時間の44%で1ビット、時間の22%で2ビット、時間の33%で3ビットになることです。データの一部の文字列は拡大しますが、他の文字列は縮小します。縮小したペアは、確率分布が予想どおりだった場合、成長するペアを上回ります(4/9ファイルは少し縮小し、2/9は同じままで、3/9は成長するため、ペアはオンになります平均で1/9ビット縮小し、ファイルは平均で1/18縮小します(1/9の数値はビットあたりのビットだったため)。

ビットの分布が実際に50%の場合、ペアの25%のみが1ビットになり、25%が2ビットのままになり、50%が3ビットになります。その結果、ビットの25%が縮小し、50%が増加するため、ペアは平均で25%増加し、ファイルは12.5%増加します。損益分岐点は、設定されているビットの約38.2%(2から黄金平均)であり、ビットペアの38.2%が縮小し、同じ割合で増加します。

60
supercat

普遍的に最適な圧縮アルゴリズムはありません。異なるデータを処理するために、さまざまなアルゴリズムが発明されました。

たとえば、JPEG圧縮を使用すると、画像の赤が0xFFまたは0xFE(通常)である場合はそれほど重要ではないため、画像を非常に多く圧縮できます。ただし、テキストドキュメントを圧縮しようとすると、このような変更は悲惨なものになります。

また、同じ種類のデータで動作するように設計された2つの圧縮アルゴリズムの間でさえ、結果はデー​​タによって異なります。

例:gzip tarballを使用する方が小さい場合があり、bzip tarballを使用する方が小さい場合があります。

最後に、十分な長さの真にランダムなデータの場合、データはおそらく元のデータとほぼ同じサイズ(またはそれ以上)になります。

9
helloworld922

ファイルアーカイバ 7z[〜#〜] lzma [〜#〜] (Lempel Ziv Markow Algorithm)を使用します。これは現在最高の圧縮アルゴリズムの1つです。圧縮率(ページ Linux圧縮の比較 を参照)。

高い圧縮率のほかの利点:

  • 高速解凍、圧縮の約10〜20倍高速
  • ファイルの解凍中の小さなメモリフットプリント
2
Christian Ammer