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
Antwort
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
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
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
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
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.
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
aber immer noch bin ich mir nicht sicher, wie 1- das n in angemessener Zeit und 2- was mit den Kanten zu tun ... – beebee
Für die Kanten, behandeln Sie es, als ob das Array wäre umgeben von Nullen. –
- 1. Welcher Klassenlader wird verwendet?
- 2. Welcher Partitionsalgorithmus wird verwendet? (für Quicksort)
- 3. Welcher Typ wird automatisch für Container verwendet?
- 4. Welcher Datentyp für die Währungsumrechnung verwendet wird
- 5. Welcher Datentyp wird für die Ordinalzahl verwendet?
- 6. Welcher Namespace für Details wird häufig verwendet?
- 7. Welcher Dokumentationsgenerator wird für lodash.com verwendet?
- 8. Komprimierungsalgorithmus für JSON-codierte Pakete?
- 9. Welcher C++ - Profiler wird verwendet?
- 10. Der beste Komprimierungsalgorithmus für XML?
- 11. Ermitteln, welcher Webserver verwendet wird
- 12. Welcher Itemtype wird für eine Website für Vermietungsplätze verwendet?
- 13. Unterscheiden Sie, welcher Authentifizierungsmechanismus verwendet wird
- 14. Welcher "Format" -Parameter wird für Django REST Framework-Ansichten verwendet?
- 15. In Elixir/Erlang, welcher Port wird für `Node.connect` verwendet?
- 16. Welcher Algorithmus zum Generieren der Zeittabelle für Schulen verwendet wird
- 17. Wie entscheidet gitlab, welcher Runner für einen Job verwendet wird?
- 18. Wie entscheidet man, welcher Wurzelwert für GraphQL-Mutationen verwendet wird?
- 19. Welcher Objekttyp wird für die Zuweisung mehrerer s4-Klassenobjekte verwendet?
- 20. Welcher Authentifizierungstyp wird für die Solace Client Cert-Authentifizierung verwendet?
- 21. Welcher Algorithmus wird von GMP für Primfeldinversion (mpz_invert) verwendet?
- 22. WPF WebBrowser-Steuerelement: Welcher Browser wird verwendet?
- 23. Welcher Port wird mit socket.io verwendet?
- 24. GIT und SSH, welcher Schlüssel wird verwendet?
- 25. Welcher "kompatible" Schlüssel wird im Gerätebaum verwendet?
- 26. Welcher Sortieralgorithmus wird von LINQ "OrderBy" verwendet?
- 27. Welcher "Cache" wird in sqlhelperparametercache verwendet
- 28. Welcher Cache-Algorithmus wird in Ccache verwendet?
- 29. Der beste Komprimierungsalgorithmus für die URL-Abfragezeichenfolge
- 30. Welcher Rahmen verwendet `IServiceProvider`?
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
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
Versuchen Sie, [dieses Papier] (https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf) zu lesen. – jxh