protocol protobuf google buffers array protocol-buffers

protocol-buffers - protobuf - protocol buffers array



google protobuf tamaño máximo (2)

  1. No creo que el compilador protobuf alguna vez se queje sobre el tamaño de los mensajes. Al menos no hasta que llegue al máximo de 18 uint64_t de uint64_t .

  2. Para la mayoría de las implementaciones, el rendimiento comienza a sufrir en el punto donde el mensaje no puede encajar en la RAM de una vez. Así que 10 MB deberían estar bien, 10 GB no. Otro problema posible es que si no necesita todos los datos: protobuf no admite el acceso aleatorio, por lo que debe decodificar todo el mensaje, incluso si solo necesita una parte.

Tengo algunos elementos que se repiten en mi mensaje protobuf. En el tiempo de ejecución, la longitud del mensaje puede ser cualquier cosa, veo algunas preguntas ya formuladas como esta: [1]: Tamaño máximo de mensaje de Protobuf serializado

  1. Tengo una pregunta un poco diferente aquí. Si mi proveedor de JMS (servicio de mensajería Java) (en este caso mi servidor weblogic o tibco jms) no tiene un límite de tamaño en el tamaño máximo de mensaje, ¿se quejará el compilador del búfer de protocolo sobre el tamaño máximo del mensaje?
  2. ¿El rendimiento de la codificación / decodificación sufre horriblemente en tamaños grandes (alrededor de ~ 10 MB)?

10MB lo está empujando pero probablemente estarás bien.

Protobuf tiene un límite rígido de 2 GB, porque muchas implementaciones utilizan aritmética con signo de 32 bits. Por razones de seguridad, muchas implementaciones (especialmente las proporcionadas por Google) imponen un límite de tamaño de 64 MB por defecto, aunque puede aumentar este límite manualmente si lo necesita.

La implementación no se "ralentizará" con mensajes grandes per se, pero el problema es que siempre debe analizar un mensaje completo a la vez antes de poder comenzar a usar cualquiera de los contenidos. Esto significa que todo el mensaje debe encajar en la RAM (teniendo en cuenta que después de analizar los objetos de mensaje en memoria son mucho más grandes que el mensaje serializado original), e incluso si solo te importa un campo, debes esperar a que todo analizar gramaticalmente.

En general, recomiendo tratar de limitarte a 1 MB como regla general. Más allá de eso, piense en dividir el mensaje en múltiples partes que se pueden analizar de forma independiente. Sin embargo, cada aplicación, para algunos, 10MB no es gran cosa, para otros 1MB es demasiado grande. Tendrás que perfilar tu propia aplicación para averiguarlo.

De hecho, he visto casos en los que la gente estaba feliz enviando mensajes de más de 1 GB, así que ... "funciona".

En una nota al margen, Cap''n Proto tiene un diseño muy similar al de Protobuf, pero puede admitir mensajes de hasta 2 ^ 64 bytes (2 ^ 32 segmentos de 4GB cada uno), y realmente le permite leer un campo del mensaje sin analizando todo el mensaje (si está en un archivo en el disco, use mmap() para evitar leerlo todo).

(Divulgación: soy el autor de Cap''n Proto y la mayor parte del código de código abierto de Protobuf de Google).