Как в потоковом режиме обрабатывать плоский буфер больше, чем ОЗУ? - PullRequest
1 голос
/ 04 апреля 2019

У нас есть следующий сценарий:

  • Мы создаем приложение flatbuffer в среде с допускается только статическое выделение памяти .
  • Наши входящие плоские буферы содержат образы обновления программного обеспечения, которые больше, чем вся доступная оперативная память на процессоре.
  • Требуется частично обработать входящий плоский буфер и передать изображения на другое устройство для хранения.
  • Блок обработки не имеет постоянного хранилища, мы не можем сбросить большой плоский буфер и использовать mmap().
  • Мы хотим использовать класс flatbuffers::Verifier для проверки правильности полученного нами плоского буфера

Наш подход состоял в том, чтобы хранить метаинформацию об объектах в [ObjectInfo] и двоично объединять все объекты изображения и помещать ее в вектор ubyte.

Но мы должны вручную отследить указатель на буфер и место, где мы находимся в векторе objects. Мы не получаем прибыль от сгенерированного плоского буфера кода для доступа к objects.

Пример схемы для задачи:

root_type Container;

table Container {
    // Information about the big objects, has to fit into RAM,
    metaInfo:[ObjectInfo]
    // Does not fit into RAM, has to be streamed with arbitrary size buffer
    bigObjects:[Objects];
}

table ObjectInfo {
    type:int;  
    name:string;
    offset:double; // Offset within Objects
    length:double; // length of object
}

table Objects {
    objects:[ubyte] // Contains the objects, contatinated 
}

Нам нужно частично обработать плоские буферы. Что мы можем сделать?

1 Ответ

1 голос
/ 04 апреля 2019

Нет элегантного способа сделать это с FlatBuffers, это потребовало бы много хаков.Вы не можете проверить частичный буфер.Вы не можете безопасно переходить по ссылкам на другие таблицы и т. Д.

Если вы хотите выполнить потоковую передачу, поместите каждый фрагмент данных в свой собственный FlatBuffer, который по отдельности помещается в ram, а затем выполните потоковую передачу последовательности таких буферов.Вы можете использовать функциональность SizePrefixed для упрощения потоковой передачи этих буферов.Вы можете использовать file_identifier для распознавания различных типов буферов.

Кроме того, не используйте double для данных смещения / длины, используйте целочисленный тип соответствующего размера.

...