2009-05-18 29 views
8

私は位置データ(緯度、経度、日時)を圧縮します。すべての数字は固定形式です。それらの2つ(緯度、経度)は10進形式です。その他の2は整数です。数値の圧縮アルゴリズム

ここで、これらの数字は固定のフォーマット文字列です。

数字を固定形式で圧縮するアルゴリズムとは何ですか? 番号圧縮のみ(ある場合)は文字列圧縮よりも優れていますか? 数値に変換せずに文字列を直接圧縮し、圧縮する必要がありますか?

ありがとうございます。

+1

緯度/経度の固定小数点または浮動小数点を使用していますか?固定数の位置がある場合は、値をバイト配列にバイトパックするだけで済みます。このように、各パケットのデータ量が少ないため、圧縮/パケットヘッダーでは、データ自体よりも多くのヘッダーを持つことになります。また、どの言語で作業していますか? –

答えて

7

これは、少し理論が役立つこれらの場所の1つです。

  • 測定値の分解能は、0.1°または0.001°ですか? 1秒または1マイクロ秒?
  • は、関連した測定値で、ある順序で、または一緒にランダムに投げられた測定値ですか?

たとえば、分解能が0.01度であるとします。あなたの値の範囲は-180°〜+ 180°、つまり35900種類です。 Lg(35900)≈ 16したがって、16ビットが必要です。 -90°〜+ 90°の場合は14ビットです。明らかに、この種の値を浮動小数点として格納する場合は、データをすぐに半分に圧縮することができます。

同様に、日付時刻とは何ですか?何ビット持っていなければなりませんか?

データが何らかの順序(1つの船に順次取り込まれたサンプルなど)であれば、必要なのは開始値とデルタだけです。 が大きいとという違いがあります。船舶が30ノットで移動する場合、その位置は、約0.03度/時または約0.0000083度/秒をそれ以上変化させることはできない。これらのデルタは非常に小さな値になるので、非常に少ないビット数で保存することができます。

重要なことは、できることがたくさんあることですが、推奨事項を作成するよりもデータについてもっと知る必要があります。


更新:ああ、待って、固定小数点文字列?!

これは(比較的)簡単です。ちょうど、はい、あなたの文字列をいくつかのバイナリ表現に変換したいと思います。ただ、データ項目を構成する、あなたは

 
| 4000   | short int, 16 bits | 
| 10500   | short int, 16 bits | 
| 20090518212100Z | 64 bits   | 

に変換することができ

040.00105.0020090518212100Z 

があるかもしれないので、それが26のバイト対96ビット、12バイトです。

+0

あなたの素晴らしい提案をありがとう。私はそのようなソリューションを期待していました。 ここでは、データ形式は固定されており、何千もの連続したデータがあります。だから、ここでデルタの方が効率的だと思います。問題は、インデックスが作成されていないことです。したがって、データを読み込む前にデータを解凍する必要があります。 より優れたインデックス作成ソリューションを提案できますか? ありがとうございます。 – fireball003

+1

私たちは、データが本当に好きで、損失が容認できるものになってから始めます。しかし、カップルの考え:kステップごとに完全な値を保存するので、k/2ステップ以上の合計を実行する必要はありません。第1微分と変化するステップ幅を格納する(「適応差分符号化」を参照)。)2番目の選択肢はいくつかの情報を失いますが、どれだけ下限を設定することもできます。 –

5

通常、圧縮はバイトストリームで機能します。ストリームがバイト値の不均一な分布(例えば、テキストまたはテキストとして格納された数値)を持つ場合、より頻繁に出現するバイトを格納するためにより少ないビットが使用されるので、達成できる圧縮比は高くなります(Huffman圧縮)。

通常、あなたが話しているデータは、単純に2進数(テキストではありません)として保存されます。これは通常、スペースと検索に効率的です。

私はあなたが圧縮されたデータのどのような種類The Data Compression Book

2

を見てお勧めしますか?どのように配布されていますか?それはどんな方法で注文されますか?これらのすべてが圧縮の程度に影響を与える可能性があり、おそらくデータをより簡単に圧縮したり、ゲートから単純に圧縮したりすることができます。

データ圧縮は「ランダム」データでは機能しません。あなたのデータがより小さな範囲内にあれば、それをうまく活用できるかもしれません。

実際には、一般的なアルゴリズムを実行して、データが「十分圧縮されている」かどうかを確認するだけです。そうでない場合、圧縮アルゴリズムによって「直感的」にできるデータよりも多くのことを知っていれば、その情報を活用する必要があります。

例として、あなたのデータはLatとLongのデータだけではなく、お互いに「近い」とみなされています。その後、おそらく "原点"の緯度と経度を保存することができ、残りは微分可能です。おそらく、これらの違いは、署名された単一のバイトに収まるのに十分小さいものです。

これは、データの知識といくつかの一般的なアルゴリズムが把握できない場合があることの、単純な例です。

1

これは、データをどのように処理するか、必要とする精度によって異なります。

Lat/longは伝統的に度、分、秒で指定され、60秒から60分、度から60分、緯度1度は名目上60海里(nmi)です。 1分は1 nmi、1秒は100フィートを少し上回っています

緯度は-90度から+90度になります。緯度を整数秒で表すと、-324000〜+ 324000、つまり約20ビットの範囲が得られます。経度は-180から+180になりますので、同じように経度を表すと1ビット多く必要です。

したがって、完全な緯度/経度位置を+/- 50フィートまで41ビットで表すことができます。

明らかに、あまり精度が必要ない場合は、ビット数を戻すことができます。

伝統的な単精度32ビット浮動小数点数は約24ビットの仮数を使用するので、緯度/経度を数秒で浮動小数点に変換すると約+/- 6フィートになります。このようなことのために、2つの単精度浮動小数点数を打つのは難しいです。

関連する問題