2010-11-15 8 views
13

La mia applicazione (DSP) produce dati a una velocità costante. La velocità dipende dalla configurazione selezionata dall'utente. Mi piacerebbe sapere quanti byte sono generati al secondo. La struttura dati contiene un campo a virgola mobile ripetuto (imballato). La lunghezza del campo è costante, ma può essere modificata dall'utente.I buffer del protocollo google supportano il calcolo delle dimensioni prima della serializzazione?

Esiste una funzione di buffer di protocollo che calcolerà la dimensione del messaggio prima della serializzazione?

risposta

7

È impossibile sapere prima del tempo, perché protobuf racchiude le strutture fornite nel minor numero possibile di byte, ad esempio non utilizza quattro byte per int x = 1;, quindi la libreria dovrebbe percorrere l'intero grafico per sapere la dimensione dell'output.

Credo che lo si possa scoprire eseguendo un'operazione di serializzazione su un flusso compatibile con protobuf del proprio progetto che conta solo i byte dati. Potrebbe essere costoso, ma non più costoso di quello che sarebbe per la biblioteca fare quel lavoro.

+0

Come possiamo forzare l'uso di 4 byte per int e non comprimerlo, per avere dati serializzati di dimensioni fisse? –

+0

Se si serializzano i dati autonomamente utilizzando le classi ProtoBuf OutputStream, è possibile farlo utilizzando i metodi Write per ciascun tipo di base piuttosto che la codifica di varint: vedere https://developers.google.com/protocol-buffers/docs/encoding –

15

Se gli oggetti messaggio sono stati compilati, è possibile chiamare ByteSize() sul messaggio che restituisce il numero di byte che il messaggio serializzato occuperà. C'è un collegamento ai documenti C++ di ByteSize.

+0

Is c'è qualche ByteSize() - come API per Python? Ho visto [questo] (https://developers.google.com/protocol-buffers/docs/reference/python/) e non ho trovato nulla –