Подтвердить что ты не робот

Сравнить JSON и BSON

Я сравниваю JSON и BSON для сериализации объектов. Эти объекты содержат несколько массивов большого числа целых чисел. В моем тесте объект, который я сериализую, содержит общее число около 12 000 целых чисел. Меня интересует только то, как сравниваются размеры сериализованных результатов. Я использую JSON.NET в качестве библиотеки, которая выполняет сериализацию. Я использую JSON, потому что я также хочу иметь возможность работать с ним в Javascript.

Размер строки 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();
        }

Edit:

Вот результирующие файлы https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-ZZp8C_0gcR0

4b9b3361

Ответ 1

Эффективность JSON vs BSON зависит от размера целых чисел, которые вы храните. Там интересный момент, когда ASCII занимает меньше байтов, чем фактически сохраняет целые типы. 64-разрядные целые числа, то есть, как он выглядит в вашем документе BSON, занимают 8 байтов. Ваши номера составляют менее 10 000, что означает, что вы можете хранить каждый в ASCII в 4 байтах (по одному байту для каждого символа до 9999). Фактически, большинство ваших данных выглядят меньше 1000, то есть они могут храниться в 3 или менее байтах. Конечно, десериализация требует времени и не дешево, но экономит место. Кроме того, Javascript использует 64-битные значения для представления всех чисел, поэтому, если вы написали его в BSON после преобразования каждого целого в более подходящий формат данных, ваш файл BSON мог бы быть намного больше.

Согласно спецификации, BSON содержит много метаданных, которые JSON не делает. Эти метаданные в основном являются префиксами длины, поэтому вы можете пропустить данные, которые вам не интересны. Например, возьмите следующие данные:

["hello there, this is an necessarily long string.  It 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 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, вам нужно разобрать все первые две строки, чтобы узнать, где третий. Если вы используете BSON, вы получите разметку больше (но не на самом деле, потому что я делаю эту разметку для примера):

[175 "hello there, this is an necessarily long string.  It 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 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.

Еще одна вещь, которую следует учитывать в вашем выборе, - это читаемость человека. Если вам нужно отладить отчет о сбоях, содержащий BSON, вам, вероятно, понадобится утилита для его расшифровки. Вы, вероятно, не просто знаете BSON, но можете просто прочитать JSON.

FAQ