tob*_*obi 6 c++ protocol-buffers
我想将地形数据保存到文件中并仅加载其中的某些部分,因为它太大而无法将其作为一个整体存储在内存中。实际上我什至不知道 protobuf 是否适合这个目的。
例如,我会有一个类似的结构(可能在语法上无效,我只知道简单的基础知识):
message Quad {
required int32 x = 1;
required int32 z = 2;
repeated int32 y = 3;
}
Run Code Online (Sandbox Code Playgroud)
x和z值在我的程序中可用,通过使用它们,我想找到具有相同x和z(在文件中)的正确 Quad 对象以获得y值。但是,我不能只使用ParseFromIstream()解析文件,因为(我认为是这样)它将整个文件加载到内存中,但在我的情况下,文件太大了。
那么,protobuf 是否能够加载一个对象,然后发送给我检查它,如果该对象错误,请给我第二个对象?
实际上...我可以问:ParseFromIstream()是否将整个文件加载到内存中?
这取决于您使用的实现。有些具有“按序列读取”API。例如,假设您将其存储为“重复四边形”,那么使用 protobuf-net 将是:
int x = ..., y = ...;
var found = Serializer.DeserializeItems<Quad>(source)
.Where(q => q.x ==x && q.y == y);
Run Code Online (Sandbox Code Playgroud)
要点是:它产生假脱机(不是一次全部加载)和短路序列。
我具体不知道 c++ api,但我希望它有类似的东西 - 但最坏的情况是你可以解析 varint 标头并准备一个长度上限的流。