web-dev-qa-db-fra.com

Comparez JSON et BSON

Je compare JSON et BSON pour sérialiser des objets. Ces objets contiennent plusieurs tableaux d'un grand nombre d'entiers. Dans mon test, l'objet que je sérialise contient un nombre total d'environ 12 000 entiers. Je ne suis intéressé que par la façon dont les tailles se comparent aux résultats sérialisés. J'utilise JSON.NET comme bibliothèque qui effectue la sérialisation. J'utilise JSON parce que je veux aussi pouvoir travailler avec Javascript.

La taille de la chaîne JSON est d'environ 43 Ko et la taille du résultat BSON est de 161 Ko. Donc, un facteur de différence d'environ 4. Ce n'est pas ce à quoi je m'attendais parce que j'ai regardé BSON parce que je pensais que BSON était plus efficace pour stocker des données.

Donc ma question est pourquoi BSON n'est pas efficace, peut-il être rendu plus efficace? Ou existe-t-il une autre façon de sérialiser les données avec des tableaux contenant un grand nombre d'entiers, qui peuvent être facilement gérés en Javascript?

Vous trouverez ci-dessous le code pour tester la sérialisation 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();
        }

Éditer:

Voici les fichiers résultants https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-ZZp8C_0gcR

39
Ronald

L'efficacité de JSON vs BSON dépend de la taille des entiers que vous stockez. Il y a un point intéressant où ASCII prend moins d'octets que le stockage réel de types entiers. Les entiers 64 bits, c'est ainsi que votre document BSON apparaît, prennent 8 octets. Vos nombres sont tous inférieurs à 10 000 , ce qui signifie que vous pouvez stocker chacun d'eux dans ASCII dans 4 octets (un octet pour chaque caractère jusqu'à 9999). En fait, la plupart de vos données semblent inférieures à 1 000, ce qui signifie qu'elles peuvent être stocké dans 3 octets ou moins. Bien sûr, cette désérialisation prend du temps et n'est pas bon marché, mais elle économise de l'espace. De plus, Javascript utilise des valeurs 64 bits pour représenter tous les nombres, donc si vous l'avez écrit en BSON après la conversion de chaque entier à un format de données plus approprié, votre fichier BSON pourrait être beaucoup plus volumineux.

Selon la spécification, BSON contient beaucoup de métadonnées que JSON ne contient pas. Ces métadonnées sont principalement des préfixes de longueur afin que vous puissiez ignorer les données qui ne vous intéressent pas. Par exemple, prenez les données suivantes:

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

Maintenant, si vous utilisez JSON, vous devez analyser l'intégralité des deux premières chaînes pour savoir où se trouve la troisième. Si vous utilisez BSON, vous obtiendrez plus de balisage (mais pas en fait, parce que je fais ce balisage à titre d'exemple):

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

Alors maintenant, vous pouvez lire '175', savoir sauter 175 octets, puis lire '169', sauter 169 octets, puis lire '19' et copier les 19 octets suivants dans votre chaîne. De cette façon, vous n'avez même pas besoin d'analyser les chaînes pour les délimiteurs.

L'utilisation de l'un par rapport à l'autre dépend beaucoup de vos besoins. Si vous allez stocker d'énormes documents que vous avez tout le temps à analyser, mais que votre espace disque est limité, utilisez JSON car il est plus compact et plus économe en espace. Si vous allez stocker des documents, mais réduire le temps d'attente (peut-être dans un contexte de serveur) est plus important pour vous que d'économiser de l'espace disque, utilisez BSON.

Une autre chose à considérer dans votre choix est la lisibilité humaine. Si vous devez déboguer un rapport d'erreur contenant BSON, vous aurez probablement besoin d'un utilitaire pour le déchiffrer. Vous ne connaissez probablement pas seulement BSON, mais vous pouvez simplement lire JSON.

FAQ

67
saml