如何流处理比RAM大的Flatbuffer?

时间:2019-04-04 06:19:09

标签: flatbuffers

我们有以下情况:

  • 我们正在允许仅允许静态内存分配的环境中构建平面缓冲区应用程序。
  • 我们传入的Flatbuffer包含软件更新映像,这些映像大于处理单元上整个可用的RAM。
  • 我们需要部分处理传入的Flatbuffer,并将图像流式传输到另一个单元进行存储。
  • 处理单元没有持久性存储,我们不能转储大的平​​面缓冲区并使用mmap()
  • 我们想利用flatbuffers::Verifier类来检查我们收到的FlatBuffer是否正确

我们的方法是将有关对象的元信息存储在[ObjectInfo]中,并二进制连接所有图像对象,然后将其放入ubyte向量中。

但是我们必须手动跟踪指向缓冲区的指针以及我们在objects向量内的位置。我们不能从Flatbuffer生成的代码访问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 
}

我们需要部分处理Flatbuffer。 我们该怎么办?

1 个答案:

答案 0 :(得分:1)

使用FlatBuffers并没有完美的方法,这需要大量的技巧。您无法验证部分缓冲区。您不能安全地遵循对其他表的引用,等等。

如果要流式传输,请将每个数据放入各自适合于ram的自己的FlatBuffer中,然后流式传输此类缓冲区的序列。您可以使用SizePrefixed功能使这些缓冲区易于流传输。您可以使用file_identifier来识别不同类型的缓冲区。

此外,不要对偏移量/长度数据使用double,请使用适当大小的整数类型。