2011-12-27 5 views
9

ProtoBuf에서 첫 번째 파일 형식을 설계하려고하는데 메모리/스트림 레이아웃이 완전히 명확하지 않기 때문에 어떤 경우에 가장 좋은 선택인지 모르겠습니다. ProtoBuf에서 "missing optional"/ "empty repeated"필드가 얼마나 많은 메모리를 사용합니까?

그래서 나는 실제로 몇 가지 질문을 가지고 있지만 모든 밀접하게 관련 :

1)가 생략 된 선택 필드의 비용을, 무엇을?

비트 비트 필드는 현재/부재 필드를 플래그하는 데 사용할 수 있기 때문에 하나의 코드 만 사용해야한다고 생각하지만 확실하지는 않습니다. 대신 선택적 필드 당 전체 바이트를 사용할 수 있습니다.

2) 필드가 비어 있으면 반복되는 필드 비용은 어떻게됩니까? 옵션 필드와 마찬가지로 1 비트인가, 아니면 "필드 헤더"+ 크기 (varint) 바이트가 크기 0이라고 할 수 있습니까?

3) "bytes"는 암시 적으로 크기가 있기 때문에 누락 된 선택적 바이트 필드와 비어있는 필수 바이트 필드 사이에 실제로 크기 차이가 있습니까?

[편집] "메모리"란 파일 시스템이나 네트워크 대역폭에서 사용되는 공간을 의미합니다. RAM을 의미하지는 않았는데, 이는 프로그래밍 언어에 의존하기 때문입니다.

답변

13

1 : 전혀 아무것도 - 그것이 와이어에 완전히 생략

2 : 어떠한 것도 - 만 실제 내용은 포함되지 않는다; 빈 목록은 본질적으로 생략됩니다 (가능한 예외 : 빈 "팩 된"배열, 합법적으로 생략 할 수도 있음).

3 : 생략 된 비용은 없습니다. 본 제로 길이 비용 적어도 2 바이트 - 1 필드 헤더 (길이 필드의 수에 따라, < 32가 1 바이트를 가지고 낮은 필드 번호), 제로 (한 바이트)의 하나 개의 길이

추가 참고 protobuf 하위 바이트 패킹을 사용하지 않으므로 모든 필드는 항상 전체 바이트 수를 사용합니다.

은 (컨텍스트 : 내가 먼저 원칙에서 protobuf 구현을 작성했습니다, 그래서 encoding details은 나에게 매우 익숙하다) 난 당신이에 링크 된 문서를 읽은 명시 적으로 생략했다 아무것도 보지 않았다

+0

'선택적'필드는 와이어에서 생략되지 않습니다. 이 문서는 인코딩 된 메시지에는 보증처럼 들리지 않는 '해당 태그 번호를 가진 키 - 값 쌍이있을 수도 그렇지 않을 수도 있습니다. 좀 더 명확히 해 주시겠습니까? – Elpezmuerto

+0

@Elpezmuerto https://developers.google.com/protocol-buffers/docs/encoding#optional - 핵심은 '0 개 이상'입니다. "생략"의 전체적인 점은 그것이 제로의 경우라는 것입니다. 그리고 이것은 메시지의 순방향 호환성을 허용하는 바로이 것입니다. 예, 작가는 * 기본값으로 바이트를 내보낼 수 있지만 생략되지는 않습니다. 확실히 값이 있고 수신기가 생략 된 값임을 감지 할 수 없습니다 –

관련 문제