2010-11-15 27 views
13

Mon application (DSP) produit des données à un débit constant. Le tarif dépend de la configuration sélectionnée par l'utilisateur. Je voudrais savoir combien d'octets sont générés par seconde. La structure de données contient un champ à virgule flottante (condensé) répété. La longueur du champ est constante, mais peut être modifiée par l'utilisateur.Est-ce que les buffers google supportent le calcul de la taille avant la sérialisation?

Y at-il une fonction de tampons de protocole qui calcule la taille du message avant la sérialisation?

Répondre

7

Il est impossible de savoir à l'avance, car protobuf conditionne les structures dans le plus petit nombre possible d'octets - il n'utilisera pas quatre octets pour int x = 1; par exemple - donc la bibliothèque devrait parcourir tout le graphique pour savoir la taille de sortie. Je crois que vous pourriez trouver cela en effectuant une opération de sérialisation à un flux compatible protobuf de votre propre conception qui ne compte que les octets qui lui sont donnés. Cela pourrait être coûteux, mais pas plus coûteux que ce serait pour la bibliothèque de faire ce travail.

+0

Comment pouvons-nous le forcer à utiliser 4 octets pour int et ne pas l'emballer, pour avoir des données sérialisées de taille fixe? –

+0

Si vous sérialisez vous-même les données à l'aide des classes ProtoBuf OutputStream, vous pouvez le faire en utilisant les méthodes Write pour chaque type de base plutôt que l'encodage varint - voir https://developers.google.com/protocol-buffers/docs/encoding –

15

Si vous avez généré les objets de message, vous pouvez appeler ByteSize() sur le message qui renvoie le nombre d'octets que le message sérialisera. Il existe un lien vers les documents C++ de ByteSize.

+0

Y at-il une API similaire à ByteSize() pour python? J'ai vu [ceci] (https://developers.google.com/protocol-buffers/docs/reference/python/) et je n'ai rien trouvé –