首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FlatBuffers:如何使用FlatBuffers编写巨型文件

FlatBuffers:如何使用FlatBuffers编写巨型文件
EN

Stack Overflow用户
提问于 2021-07-17 02:39:26
回答 1查看 155关注 0票数 0

我有可能是30 GB的大数据。似乎我需要将它们划分成许多较小的部分,以便我可以分别使用平面缓冲区存储它们。

我已经读过这篇文章了。FlatBuffers: How to write giant files

然而,我仍然不确定该怎么做。下面我有两个问题。

我有一个这样的模式。

代码语言:javascript
复制
table A {
  number: int;
}
table B {
  a: [A];
}

root_type B

如果我有一些对象a0、a1、a2和a3,我会将它们分区为两个FlatBuffers,并将它们存储在磁盘中。第一个FlatBuffer包含a0和a1。第二个包含a2和a3。如果我需要a2数据,我如何知道哪个FlatBuffer包含a2?FlatBuffers接口是否支持此功能?

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

谢谢你的帮助。

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

代码语言:javascript
复制
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中也存在同样的问题。最后,为什么大小都等于80?

再次感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-17 03:06:25

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

如果更重要的是FlatBuffers是一个特定的大小,那么就像你所说的,保持序列化对象,直到GetSize()达到你想要的大小,但在那之后,你仍然需要序列化包含所有这些对象偏移量的向量,它是4字节*对象的数量,以及根。在读取这些内容时,您首先需要扫描所有FlatBuffers的向量大小,以便能够对它们进行索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68413874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档