2011-12-27 6 views
9

Estoy tratando de diseñar mi primer formato de archivo en ProtoBuf, y no estoy seguro de cuál es la mejor opción en algunos casos, porque el diseño de la memoria/secuencia no es del todo claro para mí.¿Cuánta memoria utilizan los campos "faltante opcional"/"repetición vacía" en ProtoBuf?

así que he hecho en varias preguntas, pero todos ellos estrechamente relacionados:

1) ¿Cuánto cuesta una materia opcional, cuando se omite?

Creo que solo debería costar un bit, ya que un campo de bits se puede utilizar para marcar campos presentes/ausentes, pero no estoy seguro. En su lugar, podrían usar un byte completo por campo opcional.

2) ¿Cuánto cuesta un campo repetido cuando está vacío? ¿También es un bit, como el campo opcional, o es "encabezado de campo" + un byte (varinta) para decir que es el tamaño 0?

3) Dado que "bytes" tiene un tamaño implícitamente, ¿existe realmente una diferencia de tamaño entre un campo de bytes opcional faltante y un campo de bytes vacíos requeridos?

[EDITAR] Por "memoria" me refería al espacio utilizado en el sistema de archivos o en el ancho de banda de la red; No quise decir RAM, ya que esto dependería del lenguaje de programación.

Respuesta

13

1: nada en absoluto - se omite por completo en el alambre

2: nada en absoluto - sólo los contenidos reales se incluyen; una lista vacía se omite esencialmente (posible excepción: matrices vacías "empacadas"; aunque incluso eso podría omitirse legítimamente)

3: omitida cuesta nada; presentes y de longitud cero costos al menos 2 bytes - un campo de encabezado (longitud depende del número de campo; números de campo bajas < 32 Tomar 1 byte), y una longitud de (un byte) cero

Nota adicional: protobuf nunca utiliza el embalaje de sub-byte, por lo que cualquier campo siempre usa un número entero de bytes.

(contexto: He escrito una aplicación protobuf a partir de primeros principios, por lo que el encoding details son bastante familiares para mí)

+0

He leído la documentación que está vinculada y no vi nada que explícitamente dice que omite Los campos 'opcionales' no se omiten en el cable. La documentación indica que 'el mensaje codificado puede tener o no un par clave-valor con ese número de etiqueta ', lo cual no suena como una garantía. ¿Puedes por favor aclarar? – Elpezmuerto

+0

@Elpezmuerto https://developers.google.com/protocol-buffers/docs/encoding#optional - el punto clave es el "cero o más"; el punto entero de "omitido" es que es el caso cero. Y es precisamente esto lo que permite la compatibilidad de los mensajes hacia adelante. Sí, el escritor * podría * emitir los bytes para el valor predeterminado, pero luego no se "omitiría"; definitivamente tendría un valor, y el receptor no podría detectar que era el valor omitido. –

Cuestiones relacionadas