web-dev-qa-db-fra.com

taille maximale de Google Protobuf

J'ai des éléments répétitifs dans mon message protobuf. Au moment de l'exécution, la longueur du message peut être n'importe quoi - je vois des questions déjà posées comme celle-ci - [1]: taille maximale du message Protobuf sérialisé

  1. J'ai une question légèrement différente ici. Si mon fournisseur JMS (service de messagerie Java) (dans ce cas, mon serveur weblogic ou tibco jms) n'a pas de limite de taille sur la taille maximale du message, le compilateur de tampon de protocole se plaindra-t-il du tout de la taille maximale du message?
  2. Les performances d'encodage/décodage souffrent-elles horriblement à de grandes tailles (environ ~ 10 Mo) ..?
20
robin bajaj

10 Mo le poussent mais vous serez probablement d'accord.

Protobuf a une limite stricte de 2 Go, car de nombreuses implémentations utilisent l'arithmétique signée 32 bits. Pour des raisons de sécurité, de nombreuses implémentations (en particulier celles fournies par Google) imposent une limite de taille de 64 Mo par défaut, bien que vous puissiez augmenter cette limite manuellement si vous en avez besoin.

L'implémentation ne "ralentira" pas avec des messages volumineux en soi, mais le problème est que vous devez toujours analyser un message entier à la fois avant de pouvoir commencer à utiliser n'importe quel contenu. Cela signifie que le message entier doit tenir dans RAM (en gardant à l'esprit qu'après l'analyse des objets de message en mémoire sont beaucoup plus grand que le message sérialisé d'origine), et même si vous ne vous souciez que d'un champ, vous devez attendre que le tout soit analysé.

En règle générale, je recommande d'essayer de vous limiter à 1 Mo en règle générale. Au-delà de cela, pensez à diviser le message en plusieurs morceaux qui peuvent être analysés indépendamment. Cependant, chaque application - pour certains, 10 Mo n'est pas un problème, pour d'autres, 1 Mo est déjà beaucoup trop important. Vous devrez profiler votre propre application pour le savoir.

J'ai en fait vu des cas où les gens étaient heureux d'envoyer des messages de plus de 1 Go, alors ... ça "marche".

En passant, Cap'n Proto a une conception très similaire à Protobuf mais peut prendre en charge des messages jusqu'à 2 ^ 64 octets (2 ^ 32 segments de 4 Go chacun), et il vous permet en fait de lire un champ du message sans analyser l'intégralité du message (s'il se trouve dans un fichier sur le disque, utilisez mmap() pour éviter de lire l'intégralité du message).

(Divulgation: je suis l'auteur de Cap'n Proto ainsi que de la plupart du code Protobuf open source de Google.)

41
Kenton Varda
  1. Je ne pense pas que le compilateur protobuf se plaindra jamais de la taille des messages. Du moins pas avant d'avoir atteint le maximum de 18 exaoctets de uint64_t.

  2. Pour la plupart des implémentations, les performances commencent à souffrir au point où le message ne peut pas tenir dans RAM à la fois. Donc 10 Mo devraient être bien, 10 Go pas. Un autre problème possible est si vous ne le faites pas besoin de toutes les données - protobuf ne prend pas en charge l'accès aléatoire, vous devez donc décoder l'intégralité du message même si vous n'en avez besoin que d'une partie.

3
jpa