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

问题描述:

我试图通过为最重复的struct创建一个压缩模式来优化我的flatbuffer大小(仅使用int的20 LSB位并将它们分成64位字),结果并不是我所期望的:文件大小增加了一点,而不是我期待的剧烈压缩,为什么我的2 ulong + 1 uint结构(第二种情况)比生成的文件中的显式结构(第一种情况)需要更多的空间? 在我的例子中,使用显式结构一个2.4MB的文件成为使用2.6M压缩一个....在flatbuffer中压缩数据结构会增加文件大小?

显式结构,直接接入领域:

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; 
} 

的第一个具有28个字节的字段值得的,而第二个20。然而,混合ulonguint常使uint需要alignme nt填充,所以它经常变成24个字节。第一个不存在这样的问题,因为两个ushort总是在一起。

尽管如此,第二个应该更小。很难说没有看到您存储的数据类型,发生了多少事情等。

例如,以上所有字段的默认值为0。如果第一个字段的字段数通常为0,那么它们将不会被存储,并且如果第二个字段总是非零,则可以解释较小的字段。

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

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

非常感谢,我会尝试您的建议。 事实上,对于1rst结构的每个实例,其中一些字段为0(不总是相同),2对夫妻大多是互斥的。

顺便说一句,如何将一个结构添加到缓冲区,当将表更改为结构时,“Create”方法不见了?该结构需要创建为本地堆栈变量并以某种方式传递给缓冲区(C风格)?