【问题标题】:How much memory is used by "missing optional"/"empty repeated" fields in ProtoBuf?ProtoBuf 中的“缺少可选”/“空重复”字段使用了多少内存?
【发布时间】:2011-12-27 22:01:40
【问题描述】:

我正在尝试在 ProtoBuf 中设计我的第一个文件格式,但我不确定在某些情况下什么是最佳选择,因为内存/流布局对我来说并不完全清楚。

所以我实际上有几个问题,但都密切相关:

1) 可选字段被省略时的成本是多少?

我认为它应该只花费一个 bit,因为位域可用于标记存在/不存在的域,但我不确定。他们可能会改为使用每个可选字段的整个字节。

2) 当重复字段为空时,它的成本是多少?它也是一位,如可选字段,还是“字段头”+一个(varint)字节表示它的大小为0?

3) 由于“bytes”隐含了一个大小,在缺少的可选字节字段和空的必需字节字段之间实际上是否存在大小差异?

[编辑] “内存”是指文件系统或网络带宽上使用的空间;我不是指 RAM,因为这取决于编程语言。

【问题讨论】:

    标签: protocol-buffers


    【解决方案1】:

    1:什么都没有 - 它在电线上完全省略

    2:什么都没有——只包括实际内容;一个空列表基本上被省略(可能的例外:空的“打包”数组;尽管即使这样也可以合理地省略)

    3:省略不花钱;当前和零长度花费至少 2 个字节 - 一个字段头(长度取决于字段编号;低字段编号

    附加说明:protobuf 从不使用子字节打包,因此任何字段总是使用整数字节数。

    (上下文:我已经根据第一原理编写了一个 protobuf 实现,所以encoding details 对我来说相当熟悉)

    【讨论】:

    • 我已经阅读了您链接到的文档,但没有看到任何明确指出省略的 optional 字段不会在线路上省略的内容。该文档指出the encoded message may or may not have a key-value pair with that tag number, 这听起来不像是保证。你能澄清一下吗?
    • @Elpezmuerto developers.google.com/protocol-buffers/docs/encoding#optional - 关键点是“零或更多”; “省略”的全部意义在于它是零情况。正是这一点允许消息的前向兼容性。是的,作者可以发出默认值的字节,但它不会被“省略”——它肯定有一个值,接收器将无法检测到它是省略的值
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2013-07-31
    • 2010-11-17
    • 2016-06-30
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多