2011-12-27 11 views
9

Sto provando a progettare il mio primo formato di file in ProtoBuf, e non sono sicuro quale sia la scelta migliore in alcuni casi, perché il layout di memoria/flusso non mi è completamente chiaro.Quanta memoria viene utilizzata dai campi "mancanti facoltativi"/"vuoti ripetuti" in ProtoBuf?

Così mi hanno di fatto molte domande, ma tutti strettamente collegati:

1) Che cosa significa un costo campo facoltativo, quando è omesso?

Penso che dovrebbe costare solo uno bit, poiché un campo di bit può essere utilizzato per contrassegnare i campi presenti/assenti, ma non lo so per certo. Potrebbero invece utilizzare un intero byte per campo opzionale.

2) Cosa costa un campo ripetuto quando è vuoto? È anche un bit, come il campo opzionale, o è "intestazione campo" + un byte (varint) per dire che è la dimensione 0?

3) Poiché "byte" ha implicitamente una dimensione, esiste effettivamente una differenza di dimensioni tra un campo byte facoltativo mancante e un campo byte vuoto richiesto?

[EDIT] Per "memoria" intendevo lo spazio utilizzato sul file system o sulla larghezza di banda della rete; Non intendevo la RAM, dato che dipendeva dal linguaggio di programmazione.

risposta

13

1: assolutamente nulla - è omesso completamente sul filo

2: assolutamente nulla - solo contenuto effettivo sono inclusi; una lista vuota viene essenzialmente omessa (possibile eccezione: gli array "imballati" vuoti, sebbene anche questo possa essere legittimamente omesso)

3: omesso non costa nulla; presenti e lunghezza zero costi almeno 2 byte - un campo di intestazione (lunghezza dipende dal numero di campo; numeri bassi campo < 32 prendono 1 byte), e una lunghezza pari a zero (un byte)

Nota complementare: protobuf non usa mai l'imballaggio sub-byte, quindi qualsiasi campo usa sempre un intero numero di byte.

(contesto: ho scritto un'implementazione protobuf da principi primi, in modo che il encoding details sono abbastanza familiare per me)

+0

Ho letto la documentazione si è collegato al e non ho visto niente che esplicitamente detto che omette I campi 'opzionali' non vengono omessi sul filo. La documenazione afferma che "il messaggio codificato può avere o meno una coppia chiave-valore con quel numero di tag", che non suona come una garanzia. Puoi chiarire per favore? – Elpezmuerto

+0

@Elpezmuerto https://developers.google.com/protocol-buffers/docs/encoding#optional - il punto chiave è "zero o più"; l'intero punto di "omesso" è che è il caso zero. Ed è proprio questo che consente la compatibilità diretta dei messaggi. Sì, lo scrittore * potrebbe * emettere i byte per il valore predefinito, ma non sarebbe "omesso" - avrebbe sicuramente un valore, e il ricevitore non sarebbe in grado di rilevare che era il valore omesso –

Problemi correlati