在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。然而,混合ulong
和uint
常使uint
需要alignme nt填充,所以它经常变成24个字节。第一个不存在这样的问题,因为两个ushort
总是在一起。
尽管如此,第二个应该更小。很难说没有看到您存储的数据类型,发生了多少事情等。
例如,以上所有字段的默认值为0
。如果第一个字段的字段数通常为0
,那么它们将不会被存储,并且如果第二个字段总是非零,则可以解释较小的字段。
您可以尝试的另一个压缩技巧是使用struct
而不是table
。这不会存储一个vtable,所以可以稍微小一点,但总是存储所有的字段,并且一旦定义就不能更改。
更进一步,使用每场的矢量而不是结构向量可能会有所帮助。
非常感谢,我会尝试您的建议。 事实上,对于1rst结构的每个实例,其中一些字段为0(不总是相同),2对夫妻大多是互斥的。
顺便说一句,如何将一个结构添加到缓冲区,当将表更改为结构时,“Create”方法不见了?该结构需要创建为本地堆栈变量并以某种方式传递给缓冲区(C风格)?