FlatBuffers 中的偏移大小是多少?
What is the offset size in FlatBuffers?
我们数据的主要部分是 string
s,可能有子串重复(例如域 - “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
吗? prefix/postfix 使用 FlatBuffers 的字符串表示有什么更好的选择?
PS。顺便说一句,什么是 string array
而不是 string
成本?只是多了一笔补偿费用吗?
根据 doc.
,偏移量似乎是 uint32
(4 个字节,而不是 usize
)
字符串和向量都通过它们的 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
我们数据的主要部分是 string
s,可能有子串重复(例如域 - “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
吗? prefix/postfix 使用 FlatBuffers 的字符串表示有什么更好的选择?
PS。顺便说一句,什么是 string array
而不是 string
成本?只是多了一笔补偿费用吗?
根据 doc.
,偏移量似乎是uint32
(4 个字节,而不是 usize
)
字符串和向量都通过它们的 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