2012-09-26 10 views
37

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

JSON文字列のサイズは約43kbで、BSON結果のサイズは161kbです。 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_0gcR0

+3

、(32ビットまたは64ビット整数としてよりも、単一のASCIIバイトとして線を越え、例えば、「2」を送信するために、より効率的であるかもしれそれぞれ4バイトおよび8バイト)。 これは(または類似の)データのプロパティである可能性がありますか? –

+0

私が正しく理解していると、ASCII/UTF-8でのエンコーディングがJSONで現時点でやっていることです。整数の配列を持つオブジェクトは、JSON形式の文字列にシリアル化されます。この文字列は、ワイヤを介して送信されるか、またはUTF-8でエンコードされたディスクに保存されます。したがって、数値はASCII/UTF-8バイトとして送信されます。私が間違っていれば私を修正してください。 – Ronald

+0

[Here](https://coderwall.com/p/ccdryg)は、PHPのJsonとBsonの優れたパフォーマンスベンチマークbtwです。また、[protocol-buffers-versus-json-or-bson](http://stackoverflow.com/questions/2000933/protocol-buffers-versus-json-or-bson)を参照してください。 – nawfal

答えて

62

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

この仕様によると、BSONにはJSONにはない多くのメタデータが含まれています。あなたが興味のないデータをスキップできるように、このメタデータは、主に長さの接頭辞です。たとえば、以下のデータを取る:あなたは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"] 

を、あなたは全体を解析する必要が最初の2つの文字列のうち、3番目の文字列がどこにあるかを調べる。

[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」を読むことができます:あなたはBSONを使用する場合は(私は例のために、このマークアップアップを作ってるんだから、実際にではなく)、あなたはより多くのようなマークアップを取得します順方向に175バイトをスキップしてから '169'を読み込み、169バイトをスキップして '19'を読み込み、次の19バイトを文字列にコピーします。そうすれば区切り文字の文字列を解析する必要はありません。

一方を他方に対して使用することは、ニーズに応じて大きく異なります。世界中で常時解析している巨大な文書を保存する場合、ディスク容量は限られていますが、コンパクトでスペース効率が良いため、JSONを使用してください。 文書を保存する予定ですが、ディスク領域を節約するよりも待ち時間を短縮すること(サーバコンテキストなど)が重要な場合は、BSONを使用してください。

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

FAQ

関連する問題