压缩flatbuffer中的数据结构会增加文件大小?

时间:2017-06-29 06:05:03

标签: flatbuffers

我试图通过为我所拥有的最重复的结构创建一个压缩模式来优化我的flatbuffer大小(仅使用20个LSB位的int并将它们切成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;
}

3 个答案:

答案 0 :(得分:0)

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

不过,第二个应该更小。如果没有看到你要存储的数据类型,有多少数据等,很难说出发生了什么。

例如,上面的所有字段都有默认值0。如果第一个字段的字段通常为0,那么它们将无法存储,如果第二个字段始终为非零,则可以解释较小的字段。

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

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

答案 1 :(得分:0)

非常感谢,我会尝试你的建议。 实际上,对于第一个结构的每个实例,一些字段是0(并不总是相同),2对通常是互斥的。

答案 2 :(得分:0)

BTW,如何将一个结构添加到缓冲区,将表更改为结构时,“创建”方法消失了?结构需要创建为本地堆栈变量并以某种方式传递给缓冲区(C样式)?