0

私は Web プロジェクトに取り組んでおり、非常に効率的にファイル (大量のデータ) を送信するためのフォーマットを作成する必要があります。データは完全に数値であり、いくつかのセクションに分割されています。もちろん、これはgzip圧縮で転送されます。

ファイルの圧縮が別のファイルよりも優れている理由に関する情報が見つからないようです。

浮動小数点 (32 ビット) と短整数 (16 ビット) を最小の gzip サイズになる形式でエンコードするにはどうすればよいですか?

Ps 大量のデータになるため、ここでは 5% の節約が大きな意味を持ちます。浮動小数点数には繰り返しはありませんが、整数は各ファイルで約 5 ~ 10 回繰り返される可能性があります。

4

3 に答える 3

2

データを圧縮する唯一の方法は、冗長性を取り除くことです。これは基本的に、圧縮ツールが行うことです。冗長/反復可能な部分を探し、ストリームで以前に観察されたのと同じデータへのリンク/参照に置き換えます。

データ形式をより効率的にしたい場合は、削除できる可能性のあるものをすべて削除する必要があります。たとえば、数値をテキスト (JSON、XML など) ではなくバイナリで格納する方が効率的です。テキスト形式を使用する必要がある場合は、不要なスペースや改行を削除することを検討してください。

効率的なバイナリ形式の良い例の 1 つは、Google プロトコル バッファです。これには多くの利点があり、特に数値を可変バイト数として格納することができます (つまり、数値 1 は数値 1000000 よりも少ないスペースを消費します)。

テキストまたはバイナリですが、送信前にデータを並べ替えることができれば、gzip コンプレッサーが冗長部分を見つける可能性が高くなり、圧縮率が高くなる可能性が高くなります。

于 2013-09-15T05:41:20.570 に答える
1

32ビットの浮動小数点数と16ビットの整数と言ったので、すでにバイナリでコーディングしています。

数値の範囲と有用な精度を考慮してください。それらを制限できる場合は、より少ないビットを使用して数値を再コード化できます。特にフロートは、必要以上のビットを持つ可能性があります。

正しいビット数が 8 の倍数でない場合は、バイト ストリームをビット ストリームとして扱い、必要なビットのみを使用します。次のバイト境界に移動するために追加されたビットが別の数値として解釈されないように、データの終わりを適切に処理するように注意してください。

数値が互いに何らかの相関関係にある場合は、それを利用する必要があります。たとえば、波形の表示など、連続する数値の差が通常小さい場合は、数値の代わりに差を送信します。差異は、可変長整数またはハフマン符号化または組み合わせを使用して符号化できます。たとえば、範囲のハフマン符号と各範囲内の余分なビットです。

使用できる他の相関関係がある場合は、前の値に基づいて次の値の予測子を設計します。次に、実際の値と予測値の差を送信します。前の例では、予測子は単に最後の値です。より複雑な予測子の例は、数値が 2D テーブルを表し、隣接する行と列の両方が相関している場合の 2D 予測子です。PNG 画像形式には、2D 予測変数の例がいくつかあります。

これらすべては、データ (理想的には大量のデータ) を使用して実験を行い、何が役に立ち、何が役に立たないか、わずかな利益しかないかを確認する必要があります。

于 2013-09-15T14:45:54.913 に答える
0

テキストの代わりにバイナリを使用します。

8 桁 (浮動小数点数の精度は 10 進数 8 桁)、小数点記号、およびフィールド区切り記号を含むテキスト表現の浮動小数点数は、10 バイトを消費します。バイナリ表現では、4 しかかかりません。

テキストを使用する必要がある場合は、16 進数を使用してください。消費する桁数が少なくなります。

しかし、これは圧縮されていないファイルに大きな違いをもたらしますが、これらの違いは圧縮後に消える可能性があります。しかし、あなたは試すことができます。

于 2013-09-15T06:21:45.353 に答える