【问题标题】:Incremental write of Protocol Buffer objectProtocol Buffer 对象的增量写入
【发布时间】:2011-07-26 18:30:35
【问题描述】:

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

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

message BigObject {
    repeated Message message = 1;
}

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

【问题讨论】:

    标签: protocol-buffers


    【解决方案1】:

    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); ?
    • hmm.. 当我做msg->SerializeToZeroCopyStream(output); 100x 倍文件大小为 3800 但当我做bigObject->SerializeToZeroCopyStream(output); 文件大小为 4000 位对象时包含 100 个消息。所以我认为我们错过了一些东西。
    • 哦。我明白了,你是对的。一个带有 10 个二进制格式的 msg 对象的 bigObject 与 10 个每个带有 1 个 msg 的 bigObjects 相同。
    • @Evgen 完全正确;在电线上它们是相同的
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2023-03-15
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多