Russian Qt Forum
Ноябрь 23, 2024, 11:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Потоковый бинарный JSON (с зжатием)  (Прочитано 8194 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Сентябрь 30, 2013, 11:18 »

Привет. Есть клиент и сервер. Клиент периодически (несколько раз в секунду) запрашивает данные у сервера. Обен производится в текстовом виде сейчас.
Траффик переменный, обычно сервер шлет данные об изменениях состояний объектов, и размер JSONа составляет несколько килобайт. Периодически (раз в минуту) сервер шлет все состояния объектов, размер уже порядка 700Кб текста. К серверу таких клиентов может подключаться довольно много, до десятка, иногда больше. Возникает задача передавать эти данные в бинарном виде
и вероятно всего следует использовать какое то сжатие, т.к. данные теоретиски должны ужиматься хорошо. Вопрос, как это реализовать? Т.е. механизм запрос-ответ с асинхронным посылками команд на сервер и асинхроным ответом на команду, данные о состояниях преедаются постоянно.
Читал про BSJON но не смог найти его реализацию на С++.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Октябрь 01, 2013, 13:55 »

Ну самый простой вариант, требующий минимум изменений - имеющийся протокол сжать универсальными «архиваторами».
zlib, например, (если речь о Qt - можно взять обёртку qConpress/qUncompress) или lzma SDK (не пробовал).
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Октябрь 04, 2013, 09:45 »

Читал про BSJON но не смог найти его реализацию на С++.
Как-то плохо искали
http://kenai.com/projects/mongoviewer/sources/svn/show/bson
https://qt.gitorious.org/qtplayground/qtjsonstream/source/2c7a5a89ce98e682acfe12aacf5b3a833f52f0c9:src/bson
P.S. Сам не пользовался.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Октябрь 12, 2013, 20:41 »

Нашел интересное решение UniversalBSON. Написал реализацию, выходные данные получаются в среднем на 30% меньше что уже хорошо.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Октябрь 13, 2013, 16:59 »

Попробуйте всё же мой вариант. Дописать буквально пару строк, а текстовые файлы zip жмёт обычно намного лучше, чем на 30%.
Ну хотя если большая часть вашего json'а - неповторяющиеся бинарные данные в каком-нибудь base64, то может 30% и нормальная величина.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Октябрь 17, 2013, 10:06 »

qConpress/qUncompress конечно можно глянуть, но суть в том что сервер написан на голом си без каких либо кутешных примочек, так что возникает вопрос совместимости.
Как вариант нужно искать статьи о потоковых данных, например вещание интернет радио или т.п. Еще есть мысли почитать про промышленные протоколы.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #6 : Октябрь 17, 2013, 10:27 »

qConpress/qUncompress конечно можно глянуть, но суть в том что сервер написан на голом си без каких либо кутешных примочек, так что возникает вопрос совместимости.
На этот случай я вам предлагал zlib. Как раз таки чистый C.
Из API вам хватит 3 функций:
1) compress или compress2
2) compressBound
3) uncompress
Вот описание: http://zlib.net/manual.html#Utility - всего 1 нужный вам раздел.

LZMA SDK скорее всего даст немного лучшее сжатие (и с C тоже дружит), но API там заметно сложнее, так что советую начать с первого варианта.
« Последнее редактирование: Октябрь 17, 2013, 14:03 от LisandreL » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Октябрь 18, 2013, 10:33 »

Собственно плюс BSON по сравнению с JSON + сжатие при использовании в сетевых протоколах не только и не столько в его большей компактности, скорее - в возможности обрабатывать элементы документа не дожидаясь загрузки документа целиком. Если топикстартер такой особенностью BSON не пользуется, то подозреваю, что связка JSON + сжатие будет действительно эффективнее. Стоит только помнить, что сжатие тоже "бесплатно" не дается - на него расходуются вычислительные ресурсы сервера. Что же касается C реализаций текстовых компрессоров/декомпресcоров - то их сотни. Я, например, пользовался minilzo http://www.oberhumer.com/opensource/lzo/#minilzo[/url] - 3 h файла + 1 c файл с двумя функциями (compress/decompress).
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Октябрь 19, 2013, 20:34 »

Тут еще такое дело, что данные нужно зашифровывать при передаче. Вот такое тз. раньше не заморачивались, гоняли тупо текст в локальной сети. теперь нужно шифровать, + сжимать так как данных будет намного больше чем раньше.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Октябрь 20, 2013, 01:29 »

Тут еще такое дело, что данные нужно зашифровывать при передаче. Вот такое тз. раньше не заморачивались, гоняли тупо текст в локальной сети. теперь нужно шифровать, + сжимать так как данных будет намного больше чем раньше.
Ну на счёт шифрования дело такое…
Уточните ТЗ, кто требует шифрование и для чего.
Одно дело просто от снифа прикрыться - тут вариантов масса.
Другое дело если надо какой-то категории защиты информации соответствовать. Там уже из вариантов практически только ГОСТовское шифрование с ключами из удостоверяющего центра.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #10 : Октябрь 21, 2013, 10:52 »

теперь нужно шифровать, + сжимать так как данных будет намного больше чем раньше.
Сжимайте JSON ДО шифрования. Тогда данных больше чем раньше не будет. Ну и, конечно, с учетом предыдущего сообщения, шифрование бывает разным...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 23.