2012-09-26 24 views
37

Estoy comparando JSON y BSON para serializar objetos. Estos objetos contienen varias matrices de una gran cantidad de enteros. En mi prueba, el objeto que estoy serializando contiene una cantidad total de aproximadamente 12,000 enteros. Solo me interesa cómo se comparan los tamaños de los resultados serializados. Estoy usando JSON.NET como la biblioteca que hace la serialización. Estoy usando JSON porque también quiero poder trabajar con él en Javascript.Comparar JSON y BSON

El tamaño de la cadena JSON es de aproximadamente 43kb y el tamaño del resultado BSON es de 161kb. Entonces, un factor de diferencia de aproximadamente 4. Esto no es lo que esperaba porque miré a BSON porque pensé que BSON es más eficiente en el almacenamiento de datos.

Entonces mi pregunta es por qué BSON no es eficiente, ¿se puede hacer más eficiente? ¿O hay otra forma de serializar datos con matrices que contienen una gran cantidad de enteros, que se pueden manejar fácilmente en Javascript?

A continuación encontrará el código para probar la serialización 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(); 
     } 

Editar:

Éstos son los archivos resultantes https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-ZZp8C_0gcR0

+3

Si usted tiene una gran cantidad de pequeñas cantidades, puede ser más eficiente para enviar, por ejemplo, "2" a través del cable como un solo byte ASCII que como un número entero de 32 o 64 bits (4 y 8 bytes, respectivamente). ¿Es posible que esto (o algo similar) sea una propiedad de sus datos? –

+0

Si lo entiendo correctamente, la codificación con ASCII/UTF-8 es lo que estoy haciendo en este momento con JSON. El objeto con las matrices de enteros se serializa a una cadena en formato JSON. Esta cadena se envía luego a través del cable o se guarda en el disco codificado en UTF-8. Entonces los números se envían como bytes ASCII/UTF-8. Por favor, corríjame si estoy equivocado. – Ronald

+0

[Aquí] (https://coderwall.com/p/ccdryg) es un punto de referencia de rendimiento limpio por cierto Json y Bson en php. Además, consulte [protocol-buffers-versus-json-or-bson] (http://stackoverflow.com/questions/2000933/protocol-buffers-versus-json-or-bson) – nawfal

Respuesta

62

La eficiencia de JSON vs BSON depende del tamaño de los enteros que está guardando. Hay un punto interesante en el que ASCII ocupa menos bytes que el almacenamiento de tipos enteros. Los enteros de 64 bits, que es como aparece su documento BSON, ocupan 8 bytes. Sus números son todos menos de 10,000, lo que significa que puede almacenar cada uno en ASCII en 4 bytes (un byte para cada personaje hasta 9999). De hecho, la mayoría de sus datos parecen ser menos de 1000, lo que significa que se pueden almacenar en 3 o menos bytes. Por supuesto, esa deserialización lleva tiempo y no es barata, pero ahorra espacio. Además, Javascript usa valores de 64 bits para representar todos los números, por lo que si lo escribió a BSON después de convertir cada entero a un formato de datos más apropiado, su archivo BSON podría ser mucho más grande.

De acuerdo con la especificación, BSON contiene una gran cantidad de metadatos que JSON no contiene. Estos metadatos es en su mayoría prefijos de longitud para que pueda saltar a través de los datos que usted no está interesado en, por ejemplo, tomar los siguientes datos:.

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

Ahora, si usted está utilizando JSON, usted tiene que analizar la totalidad de las dos primeras cadenas para saber dónde está el tercero. Si utiliza BSON, obtendrá marcado más como (pero no realmente, porque estoy haciendo de esta marcado por el bien de ejemplo):

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

Así que ahora, se puede leer '175', sabe para saltar hacia adelante 175 bytes, luego lea '169', salte hacia adelante 169 bytes, y luego lea '19' y copie los siguientes 19 bytes a su cadena. De esa forma ni siquiera tiene que analizar las cadenas de delimitadores.

El uso de uno frente al otro depende en gran medida de sus necesidades. Si vas a almacenar enormes documentos que tienes todo el tiempo del mundo para analizar, pero tu espacio en el disco es limitado, usa JSON porque es más compacto y eficiente en el uso del espacio. Si va a almacenar documentos, pero reducir el tiempo de espera (quizás en un contexto de servidor) es más importante para usted que guardar algo de espacio en disco, use BSON.

Otra cosa a considerar en su elección es la legibilidad humana. Si necesita depurar un informe de bloqueo que contiene BSON, probablemente necesite una utilidad para descifrarlo. Probablemente no solo conozcas a BSON, sino que puedes leer JSON.

FAQ