如何解决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 举报,一经查实,本站将立刻删除。