web-dev-qa-db-ja.com

JSONとBSONを比較する

オブジェクトをシリアル化するためにJSONとBSONを比較しています。これらのオブジェクトには、多数の整数の配列がいくつか含まれています。私のテストでは、シリアライズするオブジェクトには合計約12,000の整数が含まれています。シリアル化された結果のサイズの比較にのみ興味があります。シリアル化を行うライブラリとしてJSON.NETを使用しています。 JSONを使用しているのは、JavascriptでもJSONを使用できるようにするためです。

JSON文字列のサイズは約43kbで、BSONの結果のサイズは161kbです。したがって、約4の相違要因です。これは、BSONの方がデータを保存する方が効率的だと思ったため、BSONを調べたため、期待したものではありません。

だから私の質問は、なぜBSONが効率的ではないのですか?または、Javascriptで簡単に処理できる多数の整数を含む配列でデータをシリアル化する別の方法がありますか?

以下に、JSON/BSONシリアル化をテストするコードを見つけます。

        // 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();
        }

編集:

結果のファイルは次のとおりです https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-ZZp8C_0gcR

39
Ronald

JSON対BSONの効率は、格納している整数のサイズに依存します。 ASCIIは実際に整数型を格納するよりもバイト数が少ない。BSON文書のように見える64ビット整数は8バイトを占める。数字はすべて10,000未満である、つまり、それぞれをASCIIで4バイト(9999までの文字ごとに1バイト)に格納できることを意味します。実際、ほとんどのデータは1000未満のように見えます。もちろん、その逆シリアル化には時間がかかり、安価ではありませんが、スペースを節約します。さらに、Javascriptはすべての数値を表すために64ビット値を使用するため、各整数を変換した後にBSONに書き込んだ場合より適切なデータ形式にするには、BSONファイルをはるかに大きくすることができます。

仕様によると、BSONにはJSONにはない多くのメタデータが含まれています。このメタデータは主に長さのプレフィックスであるため、興味のないデータをスキップできます。たとえば、次のデータを取得します。

["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"]

ここで、JSONを使用している場合、最初の2つの文字列全体を解析して、3番目の文字列がどこにあるかを調べる必要があります。 BSONを使用すると、マークアップがより似たものになります(ただし、実際にはそうではありません。例として、このマークアップを作成しているためです)。

[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"]

これで、「175」を読み、前方175バイトをスキップし、「169」を読み、前方169バイトをスキップし、「19」を読み、次の19バイトを文字列にコピーすることができます。そうすれば、区切り文字の文字列を解析する必要さえありません。

どちらを使用するかは、ニーズに大きく依存します。世界中で常に解析できる膨大なドキュメントを保存するが、ディスク容量が限られている場合は、JSONを使用してください。コンパクトでスペース効率が良いからです。ドキュメントを保存する場合、ディスクスペースを節約するよりも待機時間を短縮する(おそらくサーバーコンテキストで)ことが重要な場合は、BSONを使用します。

選択する際に考慮すべきもう1つのことは、人間が読みやすいことです。 BSONを含むクラッシュレポートをデバッグする必要がある場合は、おそらくそれを解読するユーティリティが必要になります。おそらくBSONだけを知っているわけではありませんが、JSONを読むことができます。

[〜#〜] faq [〜#〜]

67
saml