serialization - Flatbuffer 线尺寸大于预期
问题描述
我正在测试一个 flatbuffers 序列化实现,但我看到序列化数据大小与原始数据大小的比率要大得多。我意识到该协议旨在允许向后兼容,并且存在导致一些膨胀的对齐考虑。但是,一旦构建,缓冲区大约是我放入其中的原始数据大小的 2 倍。这对我来说似乎很大,我怀疑这与我如何构建我的模式有关。这是我理想使用的模式。它允许灵活性,并且对我试图表示的信息类型具有良好的逻辑意义。
// IDL file
namespace Data;
// Structs \\
struct Position {
x :short;
y :short;
z :short;
}
// Tables \\
table Interaction {
pos :Position;
value :uint;
}
table Event {
interactions :[Interaction]; // 1-3 interactions are typical in a given event, but could be as high as 30
id :ubyte=255;
time1 :uint;
time2 :ulong;
}
table Packet {
events1 :[Event]; // 1000s or more are typical in a given Packet
events2 :[OtherEvent1]; // Other events that would be defined but occur much less frequently than events1
events3 :[OtherEvent2]; // Other events that would be defined but occur much less frequently than events1
}
root_type Packet;
根据我构建此架构的方式,是否预期此 2 倍线尺寸?由于给定表中的字段数量少而向量中的元素数量多,这是否可能只是不可避免的?我试图通过人为地使每个变量类型具有相同的大小(uint)来减少对齐问题,并且我尝试绕过交互表并直接使事件表具有位置结构的向量(这将消除一些向后兼容性如果我将来需要进行更改,我正在寻找)。我能够将比率降低到的最佳值是 1.7 倍。这是合理数量的额外数据吗?
解决方案
是的,对齐、间接偏移、vtables 和其他一些东西都有开销。您最好阅读https://google.github.io/flatbuffers/flatbuffers_internals.html以了解这些内容,这将有助于设计尽可能小的表示形式。
推荐阅读
- java - POI 5.0.0、xmlbeans-5.0.1、xlsx-streamer-2.2.0 java.lang.NoSuchMethodError org.apache.poi.xssf.model.SharedStringsTable.getEntryAt(I)
- c - 为什么 1+1 的大小是 5?
- php - PHP:取消/删除订阅在 MTN DEP 中不起作用
- c# - AutoMapper - 使用嵌套列表将对象列表转换为单个对象
- postgresql - PostgreSQL。这样的函数是否容易受到 SQL 注入的影响,还是安全的?
- jmeter - 用于失败测试用例的 J Meter 电子邮件配置
- php - 如何在 Codeigniter 4 中使用自定义目录路径调用模型或类
- flutter - 单击导航栏项目时,每次都应重新加载页面
- openstack - 无法通过 SSH/Ping 连接到 Openstack/packstack 专用网络上的虚拟机
- javascript - 如何使用 SQL 使用特定于“pg”模块 Postgres 的“字符串插值”查询多条记录