Frage Vergleichen Sie JSON und BSON


Ich vergleiche JSON und BSON zum Serialisieren von Objekten. Diese Objekte enthalten mehrere Arrays mit einer großen Anzahl von ganzen Zahlen. In meinem Test enthält das Objekt, das ich serialisiere, eine Gesamtzahl von ungefähr 12.000 Ganzzahlen. Ich bin nur daran interessiert, wie die Größen der serialisierten Ergebnisse vergleichen. Ich verwende JSON.NET als die Bibliothek, die die Serialisierung durchführt. Ich benutze JSON, weil ich auch in Javascript damit arbeiten möchte.

Die Größe der JSON-Zeichenfolge beträgt etwa 43 KB und die Größe des BSON-Ergebnisses beträgt 161 KB. Also ein Unterschiedsfaktor von etwa 4. Dies ist nicht das, was ich erwartet habe, weil ich BSON betrachtet habe, weil ich dachte, dass BSON beim Speichern von Daten effizienter ist.

Meine Frage ist warum ist BSON nicht effizient, kann es effizienter gemacht werden? Oder gibt es eine andere Möglichkeit, Daten mit Arrays zu katalogisieren, die eine große Anzahl von Ganzzahlen enthalten, die in Javascript einfach gehandhabt werden können?

Im Folgenden finden Sie den Code zum Testen der JSON / BSON-Serialisierung.

        // Read file which contain json string
        string _jsonString = ReadFile();
        object _object = Newtonsoft.Json.JsonConvert.DeserializeObject(_jsonString);
        FileStream _fs = File.OpenWrite("BsonFileName");
        using (Newtonsoft.Json.Bson.BsonWriter _bsonWriter = new BsonWriter(_fs) 
               { CloseOutput = false })
        {
            Newtonsoft.Json.JsonSerializer _jsonSerializer = new JsonSerializer();
            _jsonSerializer.Serialize(_bsonWriter, _object);
            _bsonWriter.Flush();
        }

Bearbeiten:

Hier sind die resultierenden Dateien https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-ZZp8C_0gcR0


37
2017-09-26 12:37


Ursprung


Antworten:


Die Effizienz von JSON vs BSON hängt von der Größe der ganzen Zahlen ab, die Sie speichern. Es gibt einen interessanten Punkt, an dem ASCII weniger Bytes benötigt als tatsächlich Integertypen zu speichern. 64-Bit-Integer, so wie es in Ihrem BSON-Dokument erscheint, benötigen 8 Bytes. Ihre Zahlen sind alle kleiner als 10.000, was bedeutet, dass Sie jede in ASCII in 4 Bytes speichern können (ein Byte für jedes Zeichen bis 9999). In der Tat sehen die meisten Ihrer Daten aus, als wären sie weniger als 1000, was bedeutet, dass sie in 3 oder weniger Bytes gespeichert werden können. Diese Deserialisierung braucht natürlich Zeit und ist nicht billig, aber sie spart Platz. Außerdem verwendet Javascript 64-Bit-Werte, um alle Zahlen darzustellen. Wenn Sie also BSON nach dem Konvertieren jeder Ganzzahl in ein geeigneteres Datenformat schreiben, könnte Ihre BSON-Datei viel größer sein.

Entsprechend der Spezifikation enthält BSON viele Metadaten, die JSON nicht besitzt. Diese Metadaten sind meist Längenpräfixe, so dass Sie Daten überspringen können, an denen Sie nicht interessiert sind. Nehmen Sie zum Beispiel die folgenden Daten:

["hello there, this is an necessarily long string.  It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.",
 "oh man. here's another string you still don't care about.  You really just want the third element in the array.  How long are the first two elements? JSON won't tell you",
 "data_you_care_about"]

Nun, wenn Sie JSON verwenden, müssen Sie die Gesamtheit der ersten zwei Strings analysieren, um herauszufinden, wo der dritte ist. Wenn Sie BSON verwenden, erhalten Sie Markup mehr wie (aber nicht wirklich, weil ich dieses Markup für Beispiel mache):

[175 "hello there, this is an necessarily long string.  It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.",
 169 "oh man. here's another string you still don't care about.  You really just want the third element in the array.  How long are the first two elements? JSON won't tell you",
 19 "data_you_care_about"]

So, jetzt können Sie '175' lesen, wissen, 175 Bytes vorwärts zu überspringen, dann '169' lesen, vorwärts 169 Bytes überspringen und dann '19' lesen und die nächsten 19 Bytes in Ihre Zeichenfolge kopieren. Auf diese Weise müssen Sie nicht einmal die Zeichenfolgen für Trennzeichen analysieren.

Die Verwendung von einem gegenüber dem anderen hängt sehr davon ab, was Ihre Bedürfnisse sind. Wenn Sie riesige Dokumente speichern möchten, die Sie zur Zeit parsen können, aber Ihr Speicherplatz begrenzt ist, verwenden Sie JSON, weil es kompakter und platzsparender ist. Wenn Sie Dokumente speichern, aber die Wartezeit (vielleicht in einem Serverkontext) reduzieren möchten, sollten Sie BSON verwenden, anstatt Speicherplatz zu sparen.

Eine andere Sache, die Sie bei Ihrer Wahl berücksichtigen sollten, ist die menschliche Lesbarkeit. Wenn Sie einen Absturzbericht, der BSON enthält, debuggen müssen, benötigen Sie wahrscheinlich ein Hilfsprogramm zum Entschlüsseln. Sie kennen BSON wahrscheinlich nicht, aber Sie können JSON einfach lesen.

FAQ


64
2017-09-26 22:49