c# – 协议缓冲区数组中浪费的字节数?

c# – 协议缓冲区数组中浪费的字节数?,第1张

概述我有一个像这样的协议缓冲区设置: [ProtoContract]Foo{ [ProtoMember(1)] Bar[] Bars;} 单个Bar被编码为67字节的协议缓冲区.这听起来是正确的,因为我知道Bar几乎只是一个64字节的数组,然后有3个字节的开销用于长度前缀. 但是,当我使用20 Bars的数组编码Foo时,需要1362个字节. 20 * 67是1340,所以只有2 我有一个像这样的协议缓冲区设置:

[ProtoContract]Foo{    [ProtoMember(1)]    bar[] bars;}

单个bar被编码为67字节的协议缓冲区.这听起来是正确的,因为我知道bar几乎只是一个64字节的数组,然后有3个字节的开销用于长度前缀.

但是,当我使用20 bars的数组编码Foo时,需要1362个字节. 20 * 67是1340,所以只有22个字节的开销用于编码数组!

为什么这会占用这么多空间?我能做些什么来减少它吗?

解决方法 这个开销很简单,它需要知道20个对象中每个对象的开始和结束位置.在没有破坏格式的情况下,我可以做任何不同的事情(即做一些违反规范的事情).

如果你真的想要血淋淋的细节:

数组或列表(如果我们排除“打包”,这里不适用)只是重复的子消息块.有两种布局可用于子消息;字符串和组.使用字符串,布局为:

[header][length][data]

其中header是wire-type和fIEld-number的varint编码的mash(在这种情况下为字段1的十六进制08),length是varint编码的数据大小,data是子对象本身.对于小对象(数据小于128字节),这通常意味着每个对象有2个字节的开销,具体取决于:字段编号(15以上的字段占用更多空间),b:数据的大小.

对于一个组,布局是:

[header][data][footer]

其中header是wire-type和fIEld-number的varint编码的mash(在这种情况下是字段1的十六进制0B),data是子对象,footer是另一个varint mash,用于指示对象的结尾(hex在这种情况下0C与字段1).

群体通常不那么受欢迎,但它们的优势在于,随着数据量的增长,它们不会产生任何开销.对于小的字段数(小于16),开销是每个对象2个字节.当然,您需要为大字段数支付双倍的费用.

总结

以上是内存溢出为你收集整理的c# – 协议缓冲区数组中浪费的字节数?全部内容,希望文章能够帮你解决c# – 协议缓冲区数组中浪费的字节数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存