Protocol buffers 协议缓冲区对象的增量写入

Protocol buffers 协议缓冲区对象的增量写入,protocol-buffers,Protocol Buffers,我有记录数据的协议缓冲区 message Message { required double val1 = 1; optional int val2 = 2; } message BigObject { repeated Message message = 1; } 我每秒接收一条消息。它们与我的BigObject一起存储在内存中,并用于某些任务。但同时,我希望将这些消息存储在文件中,以便在应用程序崩溃时进行备份。每次简单地编写BigObject都是浪费时间。我试图找

我有记录数据的协议缓冲区

message Message {
    required double val1 = 1;
    optional int val2 = 2;
}

message BigObject {
    repeated Message message = 1;
}

我每秒接收一条消息。它们与我的BigObject一起存储在内存中,并用于某些任务。但同时,我希望将这些消息存储在文件中,以便在应用程序崩溃时进行备份。每次简单地编写BigObject都是浪费时间。我试图找到一种方法,只写自上次写入文件以来添加的消息。有办法吗?

Protobuf是一种可附加的格式,您的布局非常适合这种格式。只需打开位于末尾的文件,然后从一个新的(空)
BigObject
开始。仅添加/序列化新的
消息
实例,并写入文件(从末尾开始)

现在,如果您从一开始就解析文件,您将得到一个包含所有
消息
实例(新旧)的
BigObject

实际上,您可以在每个
消息到达时将其记录下来,只要每次都用
BigObject
包装,即用伪代码

loop {
    msg = await NextMessage();
    wrapper = new BigObject();
    wrapper.Messages.Add(msg);

    file = OpenFileAtEnd();
    wrapper.WriteTo(file);
    file.Close();
}

你是说msg.WriteTo(文件)?隐马尔可夫模型。。当我执行
msg->SerializeToZeroCopyStream(输出)时100倍文件大小是3800,但当我执行
bigObject->SerializeToZeroCopyStream(输出)时文件大小为4000位对象包含100个消息。所以我想我们错过了什么。我明白了,你是对的。一个包含10个二进制格式msg对象的bigObject与10个每个包含1个msg的bigObject相同。@Evgen;在电线上它们是一样的