我有以下protobuf:
message FrameData {
... arbitrarily complex ...
}
message DataDump {
optional uint64 headerField1 = 1;
optional uint64 headerField2 = 2;
optional uint64 headerField3 = 3;
repeated FrameData frameData = 4;
}
我正在逐一迭代地创建 frameData protobuf,并且我想将 DataDump protobuf 写入文件。我可以通过简单地构建我的 DataDump protobuf 然后调用
SerializeToOstream
来做到这一点。 - 问题是数据只有几个 100gb,这样我需要先在 ram 中建立所有数据,然后才能将其转储到磁盘。由于重复字段 frameData 是 protobuf 中的最后一个字段,我认为应该可以先将 header 写入文件,然后在生成每个 FrameData protobuf 后迭代地流出 frameData 的元素。
如何才能做到这一点?
最佳答案
可以连接 Protobuf 消息(尤其是 proto2 语法消息)以合并它们的内容。要弄清楚它是如何工作的,需要阅读 protobuf encoding format documentation .
在你的情况下,你可以先写DataDump
将带有标题字段的消息放入文件中。之后,在 frameData
中放入您想要的任意数量的项目并将该消息附加到文件的末尾。重复直到所有项目都写完。
当解码器读取消息时,似乎所有项目都是大 frameData
的一部分。大批。
但是,这可能是解码端的问题:在许多实现中,这会迫使您一次将整个文件读入内存,而不是以较小的 block 处理它们。
特别是如果您想要随机访问和某种索引,存储数百 GB 的数据集可能会受益于更高级的存储格式。
关于c++将protobuf增量写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63769623/