微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FlatBuffers 中的偏移量大小是多少?

如何解决FlatBuffers 中的偏移量大小是多少?

我们的数据的主要部分是 string 可能有重复的子串(例如域 - “some.thing.com” 和 “thing.com”)。我们想重用子字符串来减少 FlatBuffers 的文件大小和内存消耗,所以我打算使用 [string] 因为我可以只引用一些现有的子字符串,例如。 thing.com 将只是一个let substr_offset = builder.create_string("thing.com") 创建的字符串,“some.thing.com”将存储为 [builder.create_string("some."),substr_offset]

但是似乎引用有成本,所以引用可能没有好处是字符串太短(小于偏移变量大小)。这是对的吗?偏移类型只是usize吗?使用 FlatBuffers 表示前缀/后缀字符串有哪些更好的替代方案?

附注。顺便说一句,什么是 string array 而不仅仅是 string 成本?只是多了一项抵消成本吗?

解决方法

字符串和向量都通过 32 位偏移量寻址,并且还有一个 32 位大小的字段作为前缀。所以:

"some.thing.com" 14 chars + 1 terminator + 4 size bytes == 19.

或者:

"thing.com" 9 chars + 1 terminator + 4 size bytes == 14.
"some." 5 chars + 1 terminator + 4 size bytes == 10.
vector of 2 strings: 2x4 bytes of offsets + 4 size bytes = 12.

总计:36 在这 36 个中,14 个是共享的,剩下 22 个字节的唯一数据比原始数据大。因此,假设经常共享,共享字符串需要为 13 字节或更大,才能使这项技术值得使用。

详情:https://google.github.io/flatbuffers/flatbuffers_internals.html

,

根据 doc,偏移量似乎是 uint32(4 个字节,而不是 usize)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。