Максимальный размер файла google protobuf

У меня есть некоторые повторяющиеся элементы в моем сообщении protobuf. Во время выполнения длина сообщения может быть что угодно - я вижу некоторые вопросы, которые уже заданы именно таким образом - [1]: Максимальный размер файла протокола Protobuf

  • У меня есть несколько иной вопрос. Если мой провайдер JMS (службы обмена сообщениями Java) (в этом случае мой веб-журнал или сервер tibco jms) не имеет никакого размера ограничение максимального размера сообщения, будет компилятор буфера протокола жаловаться на максимальный размер сообщения?
  • Есть ли производительность кодирования/декодирования страдает ужасно при больших размерах (около ~ 10 МБ)..?

Ответ 1

10MB толкает его, но вы, вероятно, будете в порядке.

Protobuf имеет жесткий предел в 2 ГБ, потому что во многих реализациях используется 32-разрядная арифметика. По соображениям безопасности многие реализации (особенно предоставленные Google) устанавливают ограничение по размеру 64 МБ по умолчанию, хотя вы можете увеличить этот предел вручную, если вам нужно.

Реализация не будет "замедляться" с большими сообщениями как таковыми, но проблема в том, что вы должны всегда разобрать все сообщение сразу, прежде чем сможете начать использовать какой-либо контент. Это означает, что все сообщение должно вписываться в ОЗУ (имея в виду, что после разбора объектов сообщений в памяти намного больше, чем исходное сериализованное сообщение), и даже если вам нужно только одно поле, вам нужно дождаться всего этого разобрать.

Как правило, я рекомендую ограничить себя 1 МБ как правило. Помимо этого, подумайте о разделении сообщения на несколько фрагментов, которые можно разобрать самостоятельно. Тем не менее, каждое приложение - для некоторых - 10 МБ, не имеет большого значения, для других 1 МБ уже слишком велико. Вам нужно будет профилировать собственное приложение, чтобы узнать.

Я действительно видел случаи, когда люди были счастливы отправлять сообщения размером более 1 ГБ, поэтому... он "работает".

На стороне примечания Cap'n Proto имеет очень похожую конструкцию Protobuf, но может поддерживать сообщения до 2 ^ 64 байта (2 ^ 32 сегмента по 4 ГБ каждый), и на самом деле это позволяет вам читать одно поле из сообщения без разбора всего сообщения (если оно находится в файле на диске, используйте mmap(), чтобы не прочитать все это).

(Раскрытие информации: Я являюсь автором Cap'n Proto, а также большей частью кода Protobuf с открытым кодом Google.)

Ответ 2

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

  • Для большинства реализаций производительность начинает страдать в тот момент, когда сообщение не может сразу входить в ОЗУ. Так что 10 МБ должно быть хорошо, 10 ГБ нет. Другая возможная проблема заключается в том, что вам не нужны все данные - protobuf не поддерживает произвольный доступ, поэтому вам нужно декодировать все сообщение, даже если вам нужна его часть.