c++将protobuf增量写入文件

标签 c++ protocol-buffers

我有以下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/

相关文章:

c++ - 使用计数器数组从文件中提取整数并计算响应数?

Android NDK,并将功能放在 Activity 类之外

java - 如何将 LocalDateTime 转换为 com.google.protobuf.Timestamp?

android - Protobuf 流式处理(惰性序列化)API

c# - 快速随机访问二进制文件,但在需要时也可以顺序访问。如何布局?

java - protobuf 中 ByteSize() 的等价物

C# Hashtable 与 C++ hash_map

c++ - 错误 : Control reaches end of non-void function in C++ for selection sort function

C++ : Trim a string to a single char, 然后将该字符转换为 float

machine-learning - 使用caffe训练我自己的jpg数据集:type "caffe.ImageDataParameter" has no field named "backend"