Инкрементная запись объекта Protocol Buffer - PullRequest
6 голосов
/ 26 июля 2011

У меня есть протокол буфера для регистрации данных.

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

message BigObject {
    repeated Message message = 1;
}

Я получаю сообщения по одному в секунду. Они хранятся в памяти вместе с моим BigObject и используются для некоторых задач. Но в то же время я хочу сохранить эти сообщения в файле для резервного копирования в случае сбоя приложения. Простое написание BigObject каждый раз будет пустой тратой времени. И я пытаюсь найти способ писать только добавленные сообщения с момента последней записи в файл. Есть ли способ для этого?

1 Ответ

3 голосов
/ 26 июля 2011

Protobuf - это добавляемый формат, и ваш макет идеально подходит для этого. Просто откройте файл , расположенный в конце , и начните с нового (пустого) BigObject. Добавьте / serialize только новый Message экземпляр и запишите в файл (с конца и далее).

Теперь, если вы проанализируете ваш файл с начала , вы получите один BigObject со всеми Message экземплярами (старыми и новыми).

На самом деле вы могли бы сделать это, регистрируя каждого индивидуума Message по мере его поступления, если вы каждый раз заключаете его в BigObject, то есть в псевдокод

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

    file = OpenFileAtEnd();
    wrapper.WriteTo(file);
    file.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...