2013-08-30 10 views
5

このプログラムは、ソケットを使用して、高度に冗長な2バイト配列(イメージのようなもの)を転送します。転送レートは比較的高い(10Mbps)が、アレイも非常に冗長である(例えば、各行はいくつかの結果として類似の値を含むことがある)。 私はzlibとlz4を試しましたが、結果は有望でしたが、私はまだより良い圧縮方法を考えていて、それはlz4のように比較的速くなければならないことを覚えておいてください。助言がありますか?高度に冗長なデータに使用する圧縮アルゴリズム

+1

「画像圧縮」とタグ付けしました。あなたは画像のストリームを圧縮しているデータですか?もしそうなら、私はロスレスビデオ/画像コーデックを使用することをお勧めします。 – Aron

+0

データは実際の画像ではありませんが、画像のように動作するためのすべての要件を満たしていますが、ロスレスビデオコーデックを見ましたが、データはリアルタイムで生成され、ビデオコーデックは圧縮フェーズでは遅くなる傾向があります。 – beebee

+0

[このペーパー](https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf)に読んでみてください。 – jxh

答えて

1

行のデータは、あなたがこのように大幅にサイズを小さくリソース/インデックスマップ、この

オリジナルファイルのようなものを作成することができます似ている場合は、あなた自身を作成することができます。
行1:1212、34、 45,1212,45,34,56,45,56
行2:34,45,1212,78,54,87、....

あなたはユニークな値のリストを作成することができます。置換えのインデックス、

34,45,54,56,78,87,1212

行1:6,0,2,6,1,0、.....

これは、30%以上のデータ転送の上にあなたを救うpotantialyことができますが、それはデータが

でどのように冗長に依存

ここでUPDATE

単純な実装ラインで始まる場合、それはで始まる場合は、「私は」あなたは "、インデックスを反対を得るのですか、単に受信側の今

std::set<int> uniqueValues 
DataTable my2dData; //assuming 2d vector implementation 
std::string indexMap; 
std::string fileCompressed = ""; 

int Find(int value){ 
    for(int i = 0; i < uniqueValues.size; ++i){ 
    if(uniqueValues[i] == value) return i; 
    } 
    return -1; 
} 

//create list of unique values 
for(int i = 0; i < my2dData.size; ++i){ 
    for(int j = 0; j < my2dData[i].size; ++j){ 
    uniqueValues.insert(my2dData[i][j]); 
    } 
}  

//create indexes 
for(int i = 0; i < my2dData.size; ++i){ 
    std::string tmpRow = ""; 
    for(int j = 0; j < my2dData[i].size; ++j){ 
    if(tmpRow == ""){ 
     tmpRow = Find(my2dData[i][j]);  
    } 
    else{ 
     tmpRow += "," + Find(my2dData[i][j]); 
    } 
    } 
    tmpRow += "\n\r"; 
    indexMap += tmpRow; 
} 

//create file to transfer 
for(int k = 0; k < uniqueValues.size; ++k){ 
    if(fileCompressed == ""){ 
     fileCompressed = "i: " + uniqueValues[k];  
    } 
    else{ 
     fileCompressed += "," + uniqueValues[k]; 
    } 
} 
fileCompressed += "\n\r\d:" + indexMap; 

d "あなたが得るデータ

+0

Fabrizioに感謝します。私は似たようなことを念頭に置いていますが、このようなメソッドを実装する前に、冗長(前述の特定のパターン)データ用に設計された標準の圧縮アルゴリズムを探しています。 – beebee

+0

@Fabrizioは正しかったと思いますが、私はzlibもあなたの問題のかなり受け入れられる解決策だと思います。高いパフォーマンスと高い複雑さのバランスのポイントを見つける必要があります。 – Netherwire

+1

あなたが言及したライブラリはかなりうまく機能しますが、汎用ライブラリはすべての状況で最適ではない「一般的」に実装されているため、私が提供した例は.obj 3dデータファイルフォーマットには時間がかからず、実装に時間がかからず、静かです。http://en.wikipedia.org/wiki/Wavefront_.obj_file – Sherlock

4

圧縮する前にPNG algorithms for filtering image dataを見てください。以前の値に基づいて2D配列内の値を予測する、より洗練された方法に簡単です。予測が良好であれば、フィルタリングは後続の圧縮ステップで劇的な改善を行うことができます。

これらのフィルタをデータで試してから、lz4にフィードしてください。

+0

Thanks Mark、私はコンセプトを持っていて、隣のピクセルのコンセプトは周囲の1ピクセルの隣人以上に拡張できると思う...私はすべての方向に距離nピクセルのウィンドウを持つことを考えている。おそらくフィルタタイプ3 ... – beebee

+0

を使用しますが、私は妥当な時間と2でnを見つけて、エッジで何をするのかは分かりません。 – beebee

+0

エッジについては、ゼロで囲まれています。 –

関連する問題