C++ protobuf可以部分读取吗?

C++ protobuf可以部分读取吗?,c++,protocol-buffers,C++,Protocol Buffers,我想将地形数据保存到一个文件中,只加载其中的一部分,因为它太大了,无法作为一个整体存储在内存中。实际上,我甚至不知道protobuf是否适合这个目的 例如,我的结构如下(可能是无效的,我只知道简单的基础知识): x和z值在我的程序中可用,通过使用它们,我希望找到具有相同x和z的正确四元对象(在文件中),以获得y值。然而,我不能仅仅用ParseFromIstream()解析文件,因为(我认为是这样)它会将整个文件加载到内存中,但在我的例子中,文件太大了 那么,protobuf是否能够加载一个对象,

我想将地形数据保存到一个文件中,只加载其中的一部分,因为它太大了,无法作为一个整体存储在内存中。实际上,我甚至不知道protobuf是否适合这个目的

例如,我的结构如下(可能是无效的,我只知道简单的基础知识):

xz值在我的程序中可用,通过使用它们,我希望找到具有相同xz的正确四元对象(在文件中),以获得y值。然而,我不能仅仅用ParseFromIstream()解析文件,因为(我认为是这样)它会将整个文件加载到内存中,但在我的例子中,文件太大了

那么,protobuf是否能够加载一个对象,发送给我进行检查,如果对象出错,请给我第二个对象


实际上。。。我可以问:ParseFromIstream()是否将整个文件加载到内存中?

这取决于您使用的实现。有些具有“作为序列读取”的API。例如,假设您将其存储为“重复四元组”,然后使用protobuf net,即:

int x = ..., y = ...;
var found = Serializer.DeserializeItems<Quad>(source)
            .Where(q => q.x ==x && q.y == y);
intx=…,y=。。。;
var found=Serializer.DeserializeItems(源)
其中(q=>q.x==x&&q.y==y);
要点是:它产生一个假脱机(不是一次加载所有)和短路序列


我不知道C++的API,但我希望它有类似的情况,但最坏的情况是你可以解析ValIN头并准备一个长度上限的流。

< P>虽然有些库允许你部分地读取文件,但是谷歌推荐的技术是简单的文件由多个消息组成:

协议缓冲区不是为处理大型消息而设计的。作为一般经验法则,如果 你处理的信息比每兆字节都要大,也许是时候考虑一下了。 替代战略

也就是说,协议缓冲区对于处理大数据量中的单个消息非常有用 设置通常,大型数据集实际上只是一个小片段的集合,每个小片段 数据块可以是结构化的数据块


因此,您只需将一长串
Quad
消息写入文件,以消息的长度分隔。如果您需要随机搜索特定的
Quad
s,您可能需要添加某种索引。

@事实上,这是一个荒谬的评论,没有任何形式的限制,即您认为它失败的地方。嘿,我目前正在阅读您的一些其他答案,我认为这些答案与我的问题类似,但我想知道protobuf的使用对我来说是否合理。现在,我将数据作为纯文本“[xz]yyyy…”,在下一行中再次[x1 z1]y1 y1 y1 y1。。。等等。protobuf序列化会使文件在这种情况下变得更小吗?哦,我找到了一个很好的答案,y值从0到255(很多都在127左右),所以看起来它会很好地压缩它。
int x = ..., y = ...;
var found = Serializer.DeserializeItems<Quad>(source)
            .Where(q => q.x ==x && q.y == y);