2010-11-15 2 views
13

Приложение My (DSP) производит данные с постоянной скоростью. Скорость зависит от конфигурации, выбранной пользователем. Я хотел бы знать, сколько байтов генерируется в секунду. Структура данных содержит многократное (упакованное) поле с плавающей запятой. Длина поля постоянна, но может быть изменена пользователем.Поддерживает ли буферы протокола Google поддержку расчета размера до сериализации?

Есть ли функция буферов протокола, которая будет вычислять размер сообщения перед сериализацией?

ответ

7

Невозможно заранее знать, потому что protobuf упаковывает структуры, которые он задает, в наименьшие возможные байты - например, он не будет использовать четыре байта для int x = 1; - так что библиотеке придется пройти весь график, чтобы узнать выходной размер.

Я считаю, вы могли бы это выяснить, выполнив операцию сериализации в потоке, соответствующем protobuf, вашего собственного дизайна, который просто подсчитывает байты, которые он задает. Это может быть дорогостоящим, но не более дорогостоящим, чем библиотека для выполнения этой работы.

+0

Как мы можем заставить его использовать 4 байта для int и не упаковывать его, чтобы иметь сериализованные данные фиксированного размера? –

+0

Если вы сами сериализуете данные, используя классы ProtoBuf OutputStream, вы можете сделать это, используя методы Write для каждого базового типа, а не varint-кодирования - см. Https://developers.google.com/protocol-buffers/docs/encoding –

15

Если вы создали объекты сообщения, вы можете вызывать ByteSize() в сообщении, которое возвращает количество байтов, которое будет обрабатывать сериализуемое сообщение. Существует ссылка на документы C++ ByteSize.

+0

Is там какой-то ByteSize() - как api для python? Я видел [это] (https://developers.google.com/protocol-buffers/docs/reference/python/), и я ничего не нашел –