BSON
http://habrahabr.net/thread/2746
BSON
Этот формат данных пришел из MongoDb и активно ими продвигается. Формат изначально был разработан для хранения данных и не предполагался для их передачи по сети. Честно говоря, после недолгих поисков в интернете мы не нашли ни одного серьезного продукта, использующего внутри себя BSON. Но давайте посмотрим, что нам может дать данный формат.
Плюсы:
- Поддержка дополнительных типов данных.
Согласно спецификации формат BSON, помимо стандартных типов данных формата JSON, BSON поддерживает еще такие типы как Date, ObjectId (https://docs.mongodb.org/manual/reference/object-id/), Null и бинарные данные (Binary data). Некоторые из них (например, ObjectId) чаще используются в MongoDb и не всегда могут быть полезны другим. Но некоторые дополнительные типы данных дают нам следующие бонусы. Если мы храним в нашем объекте дату, то в случае формата JSON у нас есть только один вариант хранения — это один из вариантов ISO-8601, и в строковом представлении. При этом, если мы хотим отфильтровать нашу коллекцию JSON-объектов по датам, при обработке нам нужно будет превратить строки в формат Date и только после этого их сравнивать между собой. BSON же хранит все даты как Int64 (так же, как и тип Date) и берет на себя всю работу по сериализации/десериализации в формат Date. Поэтому мы можем сравнивать даты без десериализации — просто как числа, что явно быстрее, чем вариант с классическим JSON. Именно это преимущество активно используется в MongoDb.
- BSON поддерживает так называемый Random read/write к своим данным.
BSON хранит длины для строк и бинарных данных, позволяя пропускать атрибуты, которые нам не интересны. JSON же последовательно считывает данные и не может попускать элемент, не прочитав его значение до конца. Таким образом, если мы будем хранить большие объемы бинарных данных внутри формата, данная особенность может сыграть для нас важную роль.
Минусы:
- Размер данных.
Что касается размера конечного файла, то тут все неоднозначно. В каких то ситуациях размер объекта будет меньше, а в каких-то — больше, все зависит от того, что лежит внутри Bson объекта. Почему так получается — нам ответит спецификация, в которой сказано, что для скорости доступа к элементам объекта формат сохраняет дополнительную информацию, такую как размер данных для больших элементов.
Так например JSON объект
```
{«hello": «world»}
превратится вот в такое
`\x16\x00\x00\x00 // total document size
\x02 // 0x02 = type String
hello\x00 // field name
\x06\x00\x00\x00world\x00 // field value
\x00 // 0x00 = type EOO ('end of object')
`
```
В спецификации сказано, что BSON разрабатывался, как формат с быстрой сериализацией / десериализацией, как минимум, за счет того, что числа он хранит как тип Int, и не тратит время на парсинг их из строки. Давайте проверим. Для тестирования нами были взяты следующие библиотеки:
- JS (node and browser) — https://github.com/mongodb/js-bson
- Go — https://github.com/go-mgo/mgo/tree/v2
И вот какие результаты мы получили (для наглядности я добавил также и результаты для JSON):
JS (Node)
|
|
Json encode
|
21,507 ops/sec (86 runs sampled)
|
Json decode
|
9,039 ops/sec (89 runs sampled)
|
Json roundtrip
|
6,090 ops/sec (93 runs sampled)
|
Json compres encode
|
1,168 ops/sec (84 runs sampled)
|
Json compres decode
|
2,980 ops/sec (93 runs sampled)
|
Json compres roundtrip
|
874 ops/sec (86 runs sampled)
|
Bson encode
|
93.21 ops/sec (76 runs sampled)
|
Bson decode
|
242 ops/sec (84 runs sampled)
|
Bson roundtrip
|
65.24 ops/sec (65 runs sampled)
|
JS (browser)
|
|
Json roundtrip
|
5,754 ops/sec
|
Json compres roundtrip
|
890 ops/sec
|
Bson roundtrip
|
374 ops/sec
|
Go
Json encode 5000 391100 ns/op 24.37 MB/s 54520 B/op 1478 allocs/op
Json decode 3000 392785 ns/op 24.27 MB/s 76634 B/op 1430 allocs/op
Json roundtrip 2000 796115 ns/op 11.97 MB/s 131150 B/op 2908 allocs/op
Json compres encode 3000 422254 ns/op 0.00 MB/s 54790 B/op 1478 allocs/op
Json compres decode 3000 464569 ns/op 4.50 MB/s 117206 B/op 1446 allocs/op
Json compres roundtrip 2000 881305 ns/op 0.00 MB/s 171795 B/op 2915 allocs/op
Bson Encode 10000 249024 ns/op 40.42 MB/s 70085 B/op 982 allocs/op
Bson Decode 3000 524408 ns/op 19.19 MB/s 124777 B/op 3580 allocs/op
Bson Roundtrip 2000 712524 ns/op 14.13 MB/s 195334 B/op 4562 allocs/op
А вот что получили по размерам данных:
JS (Node)
|
|
Json
|
9482 bytes
|
Json compressed
|
1872 bytes
|
Bson
|
112710 bytes
|
JS (Browser)
|
|
Json
|
9482 bytes
|
Json compressed
|
1872 bytes
|
Bson
|
9618 bytes
|
Хоть BSON и дает нам возможность дополнительных типов данных и, что самое главное, возможности частичного чтения / изменения данных, в плане компрессии данных у него все совсем печально.
Комментарии
Отправить комментарий