2013-08-30 10 views
5

Dieses Programm verwendet Sockets, um hochredundante 2D-Byte-Arrays (bildähnlich) zu übertragen. Während die Übertragungsrate vergleichsweise hoch ist (10 Mbps), sind die Arrays auch hochredundant (z. B. kann jede Zeile mehrere folglich ähnliche Werte enthalten). Ich habe versucht, zlib und lz4 und die Ergebnisse waren vielversprechend, aber ich denke immer noch an eine bessere Komprimierungsmethode und bitte denken Sie daran, dass es relativ schnell sein sollte wie in lz4. Irgendwelche Vorschläge? wenn die Daten in ReihenWelcher Komprimierungsalgorithmus für hochredundante Daten verwendet wird

+1

Sie haben "Bildkomprimierung" markiert. Sind die Daten, die Sie komprimieren, ein Strom von Bildern? Wenn das der Fall ist, würde ich vorschlagen, dass Sie verlustfreie Video/Bild-Codecs verwenden. – Aron

+0

Die Daten sind keine echten Bilder, aber sie erfüllen alle Anforderungen, um sich wie Bilder zu verhalten, und ich habe einen Blick auf verlustfreie Video-Codecs geworfen, aber die Daten werden in Echtzeit erzeugt und Video-Codecs neigen dazu, in der Komprimierungsphase langsam zu sein. – beebee

+0

Versuchen Sie, [dieses Papier] (https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf) zu lesen. – jxh

Antwort

1

Sie Ihre eigene Gruppe gründen könnte, ähnlich wie Sie eine Ressource/Index Karte erstellen können somit reduziert erhebliche Größe, so etwas wie diese

Original-Datei:
Zeile 1: 1212, 34, 45,1212,45,34,56,45,56
Zeile 2: 34,45,1212,78,54,87, ....

Sie eine Liste von eindeutigen Werten, als die Verwendung schaffen könnten und Index in Ersatz,

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

Zeile 1: 6,0,2,6,1,0, .....

das Sie über 30% oder mehr Datenübertragung sparen potantialy kann, aber es hängt davon ab, wie überflüssig die Daten

UPDATE

Hier ist eine einfache Implementierung

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; 

jetzt auf der Empfängerseite Sie das Gegenteil nur tun, wenn die Linie beginnen mit „i“ der Index erhalten, wenn sie beginnen mit " d "du bekommst Die Daten

+0

Danke Fabrizio. Ich habe etwas Ähnliches im Sinn. Bevor ich jedoch eine solche Methode implementiere, suche ich nach einem Standard-Kompressionsalgorithmus, der für redundante (mit dem spezifischen Muster wie erwähnt) Daten ausgelegt ist. – beebee

+0

Ich denke, @ Fabrizio hat recht, aber ich denke, zlib ist auch eine durchaus akzeptable Lösung Ihres Problems. Sie müssen den Ausgleich zwischen hoher Leistung und hoher Komplexität finden. – Netherwire

+1

die Bibliothek, die Sie erwähnt haben, eine ziemlich gute Arbeit darin, aber wie jede allgemeine Bibliothek als "allgemein" implementiert wird, die möglicherweise nicht die beste für alle Situationen ist, wird das Beispiel, das ich Ihnen zur Verfügung gestellt von den .obj 3D-Dateien verwendet Format, und sollte nicht lange dauern zu implementieren und ist leise mächtig http://en.wikipedia.org/wiki/Wavefront_.obj_file – Sherlock

4

Sie sollten die vor der Komprimierung betrachten. Sie sind einfache bis ausgeklügeltere Methoden zur Vorhersage von Werten in einem 2D-Array basierend auf vorherigen Werten. In dem Maße, in dem die Vorhersagen gut sind, kann die Filterung zu dramatischen Verbesserungen im nachfolgenden Komprimierungsschritt führen.

Sie sollten diese Filter einfach auf Ihre Daten testen und dann an lz4 füttern.

+0

Dank Mark, ich habe das Konzept und ich denke, das Konzept der Nachbarpixel könnte erweitert werden, um mehr als die umliegenden 1 Pixel Nachbarn ... Ich denke an ein Fenster mit Abstand n Pixel in alle Richtungen und dann vielleicht Filter Typ 3 ... – beebee

+0

aber immer noch bin ich mir nicht sicher, wie 1- das n in angemessener Zeit und 2- was mit den Kanten zu tun ... – beebee

+0

Für die Kanten, behandeln Sie es, als ob das Array wäre umgeben von Nullen. –

Verwandte Themen