Protocol Buffer对象的增量写入

6

我有一个用于日志记录数据的协议缓冲区。

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

message BigObject {
    repeated Message message = 1;
}

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

1个回答

3
Protobuf是一种可追加格式,而您的布局非常适合此格式。只需打开文件(位于末尾),并以新的(空)BigObject开始。添加/序列化新的Message实例,并从文件末尾开始写入。现在,如果您从开头解析文件,则会获得带有所有Message实例(旧和新)的单个BigObject。实际上,只要每次到达每个单独的Message时将其记录下来,并将其包装在BigObject中,就可以做到这一点,即伪代码。
loop {
    msg = await NextMessage();
    wrapper = new BigObject();
    wrapper.Messages.Add(msg);

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

你的意思是 msg.WriteTo(file); 吗? - Evgen Bodunov
嗯...当我执行了msg->SerializeToZeroCopyStream(output);100次时,文件大小为3800, 但是当我执行了bigObject->SerializeToZeroCopyStream(output);时,文件大小为4000。 bigObject包含100个msg。 所以我认为我们漏掉了什么。 - Evgen Bodunov
哦,我明白了,你是对的。一个包含10个二进制格式msg对象的bigObject与包含每个1个msg的10个bigObject相同。 - Evgen Bodunov
@Evgen 没错;在传输过程中它们是相同的。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接