Frage

Was wäre der beste Komprimierungsalgorithmus sein, Pakete zu verwenden, zu komprimieren, bevor sie über den Draht zu senden? Die Pakete werden unter Verwendung von JSON kodiert. Wäre LZW ein guter für das sein, oder gibt es etwas Besseres?

War es hilfreich?

Lösung

Ich denke, zwei Fragen die Antwort beeinflussen:

1) Wie gut können Sie die Zusammensetzung der Daten ohne zu wissen, vorherzusagen, was an einem bestimmten Lauf des Programms geschehen? Zum Beispiel, wenn Ihre Pakete wie folgt aussehen:

{
    "vector": {
        "latitude": 16,
        "longitude": 18,
        "altitude": 20
    },
    "vector": {
        "latitude": -8,
        "longitude": 13,
        "altitude": -5
    },
    [... et cetera ...]
}

- dann würden Sie wahrscheinlich die beste Kompression erhalten, indem eine hartcodierte Wörterbuch der Textstrings erstellen, die in Ihren Daten, die zeigen nach oben halten und jedes Auftreten eines der Textzeichenfolgen mit dem entsprechenden Wörterbuch Index ersetzen. (Eigentlich, wenn Ihre Daten sind diese regelmäßig, dann würden Sie wahrscheinlich wollen senden nur die Werte über den Draht und einfach eine Funktion in den Client schreibt ein JSON-Objekt zu konstruieren aus den Werten, wenn ein JSON-Objekt benötigt wird.)

Wenn Sie nicht vorhersagen können, die Header verwendet werden sollen, müssen Sie LZW verwenden, oder LZ77 oder eine andere Methode, die auf den Daten sieht, die durch bereits gegangen ist, die Daten zu finden, sie zum Ausdruck bringen können in einer besonders kompakten Form. Allerdings ...

2) Sind die Pakete komprimiert getrennt voneinander werden müssen? Wenn ja, dann ist LZW definitiv nicht die Methode möchten Sie; es wird keine Zeit hat, seinen Wörterbuch bis zu einer Größe zu bauen, die durch das Ende eines einzelnen Pakets erhebliche Kompressionsergebnisse geben. Die einzige Chance, in diesem Szenario wirklich wesentliche Kompression bekommen, IMHO, ist eine hartcodierte Wörterbuch zu verwenden.

(Nachtrag zu allen oben genannten: als Michael Kohne darauf hinweist, das Senden von JSON bedeutet, dass Sie wahrscheinlich den gesamten Text zu senden, was bedeutet, dass Sie Bandbreite sind underusing, die die Fähigkeit des Sendens eine viel breitere Palette von Zeichen hat als Sie ist verwenden. um jedoch das Problem, wie Zeichen zu packen, die 0-127 in Behälter in den Bereich fallen, die Werte von 0 bis 255 ist ziemlich einfach und ich denke, kann als ‚für den Leser einer Übung‘ überlassen bleiben, wie sie sagen ).

Andere Tipps

Es gibt zwei weitere JSON Komprimierungsalgorithmen: CJson & HPack Die HPack macht einen sehr guten Job, vergleichbar mit gzip-Kompression.

Ähm ... mich korrigieren, wenn ich falsch, aber wenn man auf die Komprimierung implementieren, dann steuern Sie an beiden Enden der Verbindung, nicht wahr? In diesem Fall ist, wenn JSON zu dick ein Protokoll, warum würden Sie nicht wählen Sie einfach ein anderes Draht-Protokoll, das nicht so dick ist? Ich meine, ich verstehe die Attraktivität eines Standard wie JSON verwenden, aber wenn Sie besorgt über die Bandbreite sind, dann sollten Sie wahrscheinlich ein Wire-Protokoll auswählen, die nicht der gesamte Text ist.

Lassen Sie den Webserver zu komprimieren und den Browser zu dekomprimieren nativ; gzip oder abzulassen.

Hier ist ein kurzer Test auf der Kompressibilität von JSON-Daten Original: Verbrechen-data_geojson.json 72844By (Sie können die Datei hier: https://github.com/lsauer/Data-Hub . Die Datei zufällig ausgewählt wurde, aber repräsentativ für durchschnittliche JSON-Daten kann nicht sein)

mit Ausnahme von zip alle Archivierungs Parameter wurden auf extrem gesetzt

* cm/ nanozip: 
  > 4076/72844
  [1] 0.05595519
* gzip:
  > 6611/72844
  [1] 0.09075559
* LZMA / 7zip
  > 5864/72844
  [1] 0.0805008
* Huffman / zip:
  > 7382/72844
  [1] 0.1013398
* ?/Arc:
  > 4739/72844
  [1] 0.06505683

Das bedeutet, dass die Kompression sehr hoch und vorteilhaft ist. JSON Daten haben im allgemeinen eine hohe Entropie. Laut Wikipedia

  

Die Entropierate des englischen Textes ist zwischen 1,0 und 1,5 Bits pro   Buchstaben, [1] oder so niedrig wie 0,6 bis 1,3 Bits pro Buchstaben, entsprechend   Schätzungen von Shannon auf Basis menschlichen Experimente

Die Entropie von JSON-Daten ist oft auch darüber. (In einem Experiment mit 10 beliebigen JSON-Dateien von ungefähr gleicher Größe i 2,36 berechnet)

gzip (deflate-Algorithmus) ist ziemlich gut bei der Kompression, obwohl wie alle guten Kompressionsalgorithmen, viel CPU verwendet (3-5x so viel wie Overhead von json Lesen / Schreiben auf meinem Test).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top