0

我试图通过为我拥有的最重复的结构创建一个压缩模式来优化我的 flatbuffer 大小(仅使用 20 LSB 位的整数并将它们切成 64 位字),结果不是我所期望的:文件大小增长了一点,而不是我期望的剧烈压缩,为什么我下面的 2 ulong + 1 uint 结构(第二种情况)比生成的文件中的显式结构(第一种情况)占用更多的空间?在我的示例中,使用显式结构的 2.4Mb 文件变成使用压缩结构的 2.6M....

显式结构,直接访问字段:

table VObject {
    m_field1:uint; 
    m_field2:uint;
    m_field3:ushort;
    m_field4:ushort;
    m_field5:uint;
    m_field6:uint;
    m_field7:uint;
    m_field8:uint;
}  

压缩结构,需要使用 20 位和 16 位掩码进行编码和解码:

table VObject {
    m_field1:ulong; 
    m_field2:ulong;
    m_field3:uint;
}
4

1 回答 1

0

第一个有 28 个字节的字段,第二个有 20 个。但是,混合ulonguint经常导致uint需要对齐填充,所以它经常变成 24 个字节。第一个没有这样的问题,因为两者ushort总是在一起。

不过,第二个应该更小。如果不查看您存储的数据类型、数据量等,很难判断发生了什么。

例如,以上所有字段的默认值为0. 如果第一个具有更多通常为 的字段,0则不会存储它们,这可以解释较小的大小,如果第二个字段始终为非零。

您可以尝试的另一个压缩技巧是使用 astruct而不是table. 这不会存储 vtable,因此可以稍微小一些,但始终存储所有字段,并且一旦定义就不能更改。

更进一步,使用每个字段的向量而不是结构向量可能会有所帮助。

于 2017-06-29T14:51:53.040 回答