2011-12-27 11 views
9

私はProtoBufで最初のファイル形式を設計しようとしていますが、メモリー/ストリームのレイアウトが完全にわからないため、何が最良の選択であるかわかりません。 ProtoBufの "missing optional"/"empty repeated"フィールドでどのくらいのメモリが使用されていますか?

は、だから私は実際にいくつかの質問を持っていますが、すべての密接に関連:

1)それが省略されているオプションフィールドのコストを、何?

ビットフィールドを使用して存在/不在フィールドのフラグを立てることができるため、ビットと計算されますが、わかりません。代わりに、オプションのフィールドごとにバイト全体を使用することもできます。

2)フィールドが空の場合、繰り返しフィールドコストはいくらですか?オプションフィールドのように1ビットですか、それとも "フィールドヘッダー" + 1(varint)バイトでサイズ0ですか?

3) "bytes"は暗黙的にサイズを持っているので、欠けているオプションのバイトフィールドと空の必須バイトフィールドの間に実際にサイズの違いがありますか?

[編集]「メモリ」とは、ファイルシステムまたはネットワークの帯域幅に使用されるスペースを意味します。 RAMを意味するわけではありません。プログラミング言語に依存するからです。

答えて

13

1:全く何も - それはワイヤー

2に完全に省略されている:全く何も - だけ実際の内容が含まれます。空のリストは本質的に省略されています(可能性のある例外:空の "パックされた"配列;合法的に省略することもできます)。

3:省略します。本ゼロ長コスト少なくとも 2バイト - 一つのフィールドヘッダ(長さフィールドの数に依存する。< 32は、1つのバイトを取る低フィールド番号)、及びゼロ(1バイト)の長さ

追加注:いるProtobufサブバイトパッキングを使用することはないため、どのフィールドも常にバイト数全体を使用します。

(コンテキスト:私は第一原理からいるProtobuf実装を書いたので、encoding detailsは私にはかなり精通している)

+0

私はあなたがにリンクされているドキュメントを読んで、明示的に省略することを言った何も表示されませんでした'optional'フィールドはワイヤー上で省略されません。ドキュメンテーションでは、「エンコードされたメッセージには、そのタグ番号を持つキーと値のペアがある場合とない場合があります」と記載されています。あなたは明確にしていただけますか? – Elpezmuerto

+0

@Elpezmuerto https://developers.google.com/protocol-buffers/docs/encoding#optional - 重要な点は「ゼロ以上」です。 「省略された」という全体の点は、それがゼロの場合である。メッセージの順方向互換性を可能にするのはこのことです。はい、ライター*はデフォルト値のバイトを出力できますが、それは "省略"されません - それは確かに値を持ち、受信者は省略された値であることを検出できません –