c ++将protobuf增量写入文件

c++ write protobuf incrementally to file

我有以下 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 中的最后一个,我假设应该可以先将 headers 写入文件,然后在每个 FrameData protobuf 具有后迭代地流出 frameData 的元素已生成。

如何做到这一点?

可以连接 Protobuf 消息(尤其是 proto2 语法消息)以合并其内容。要弄清楚它究竟是如何工作的,需要阅读 protobuf encoding format documentation.

在您的情况下,您可以先将带有 header 字段的 DataDump 消息写入文件。之后,将任意数量的项目放入 frameData 并将该消息附加到文件末尾。重复直到所有项目都被写入。

当解码器读取消息时,所有项目似乎都是一个大 frameData 数组的一部分。


但是,这可能是解码端的问题:在许多实现中,这会迫使您一次将整个文件读入内存,而不是将它们分成较小的块进行处理。

特别是如果您需要随机访问和某种索引,存储数百 GB 的数据集可能会受益于更高级的存储格式。