FlatBuffers:如何使用 FlatBuffers 写入巨型文件

FlatBuffers: How to write giant file using FlatBuffers

我有大数据,可能有 30 GB。看来我需要将它们分成许多小块,以便我可以分别使用 flatbuffer 存储它们。

我已经读过这个 post。

但是,我仍然不确定该怎么做。我有以下两个问题。

我有这样的架构。

table A {
  number: int;
}
table B {
  a: [A];
}

root_type B

如果我有一些对象 a0、a1、a2 和 a3,我将它们分成两个 FlatBuffer 并将它们存储在磁盘中。第一个 FlatBuffer 包含 a0 和 a1。第二个包含 a2 和 a3。如果我需要 a2 数据,我怎么知道哪个 FlatBuffer 包含 a2? FlatBuffers API 支持吗?

我按顺序创建 a0、a1、a2、a3...,我想在 FlatBuffer 大小大于 10 MB 时对它们进行分区。我知道我可以通过 int size = builder.GetSize() 获得平面缓冲区的大小。但是,由于我是按顺序创建这些对象的,所以我如何在不调用 builder.Finish(orc)?

的情况下知道 FlatBuffer 的大小

感谢您的帮助。

更新: 我写了一些这样的代码:

flatbuffers::FlatBufferBuilder builder;
int num0 = 3;
int num1 = 1;
int num2 = 5;
int num3 = 7;
auto a0 = CreateA(builder, num0);
cout << "size of a0 = " << builder.GetSize() << endl;
auto a1 = CreateA(builder, num1);
cout << "size of a0 and a1 = " << builder.GetSize() << endl;
auto a2 = CreateA(builder, num2);
cout << "size a0, a1, and a2 = " << builder.GetSize() << endl;
auto a3 = CreateA(builder, num3);
cout << "size a0, a1, a2, and a3 = " << builder.GetSize() << endl;

std::vector<flatbuffers::Offset<A>> A_vector;
A_vector.push_back(a0);
A_vector.push_back(a1);
A_vector.push_back(a2);
A_vector.push_back(a3);
auto B = builder.CreateVector(A_vector);
auto orc = CreateB(builder, B);
builder.Finish(orc);
cout << "size all = " << builder.GetSize() << endl;

// size a0 = 14
// size of a0 and a1 = 30
// size a0, a1, and a2 = 40
// size a0, a1, a2, and a3 = 48
// size all = 80

您能解释一下这些尺寸是如何计算的吗? 为什么a0和a1的大小不是a0的两倍?也就是说,14*2 = 28 而不是 30。在 a2 和 a3 中存在同样的问题。最后,为什么size都等于80?

再次感谢。

FlatBuffers 不支持跨多个 FlatBuffers 组织数据,您必须发明自己的索引机制。如果对象的大小差别不大,那么在每个 FlatBuffer 中存储完全相同数量的对象绝对是最简单和最有效的。

如果 FlatBuffers 的特定大小更重要,那么就像你说的那样,继续序列化对象直到 GetSize() 是你想要的大小,尽管在那之后你仍然需要序列化向量保存所有这些对象偏移量,即 4 字节 * 对象数和根。阅读这些内容时,您首先需要扫描所有 FlatBuffers 的矢量大小,以便能够对其进行索引。