2016-08-22 5 views
1

large set of dataは、2次元のSQUAREの配列が1と0の2次元配列です。例えば 言う:バイナリマトリックスを圧縮する

[ 
    [0,1,0], 
    [1,0,0], 
    [0,0,0] 
] 

SO-これは3次元でした。鉱山は60-70になり、120行/列(最大)になると予想されます。私はこれをAjax/API経由で送信し、データベースに格納する必要があります。 私はJsonとして連載することができますが、このようなことを処理する最適な方法があるかどうかを調べていました。同様に、一連の適切な圧縮/解凍?私はそれを考えることができ

一つの方法は次のとおりです。

  1. 6桁のクラスター内の文字列
  2. 除算として数字に参加。 111111ビン= 63 12月(AZ、AZ、0-9、_ = 26 + 26 + 10 + 1)
  3. 英数字エンコーディング(-ZA-Z0-9_)各クラスタに変換し、文字列
  4. として参加

どのようにスマート/愚か/最適この解決策ですか?すでに何か良いものがありますか?

+0

行列がほとんど0の場合は、1の座標を送信するだけです。 – samgak

+0

データ構造が固定されている場合は、非常に長いバイナリ番号にシリアル化し、GMPを使用してオクテットに変換した後、base64エンコード文字列に変換して送信します。 –

+0

コンテンツに関する詳細情報を提供する必要があります。 1と0の分布はランダムに見えますか?それは1以上の0に偏っていますか?パターンは繰り返されますか? 3つの次元がありますが、2つ与えました:60-70と120.第3は何ですか? –

答えて

0

データ構造をJSONに変換し、gzdeflate()のような標準的な圧縮アルゴリズムに渡すと、取得できるほど簡単になり、優れた圧縮率が得られます。おそらくこれ以上複雑にする理由はないでしょう。

gzdeflateの出力はバイナリデータになります。それに対応できないチャンネルで転送する必要がある場合はbase64_encodeとなりますが、その結果は元のJSONの任意の意味のあるサイズ)

0の1つの文字列に行列を "フラット化"して圧縮する前に元の行列のサイズを文字列の横に保存します。コードをもっと複雑にする費用。

あなたの質問に記述されているように、マトリックスに英数字エンコーディングを実行すると、の圧縮率が大幅に悪化します。これは、DEFLATEアルゴリズムがデータのパターンを検出するのが非常に困難になるためです。あなたのクラスタのサイズと完全に "ラインアップ"。