如何流处理大于 RAM 的平面缓冲区?

How to stream process a flatbuffer bigger than RAM?

我们有以下场景:

我们的方法是将有关对象的元信息存储在 [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 
}

我们需要部分处理平面缓冲区。 我们能做什么?

使用 FlatBuffers 没有优雅的方法可以做到这一点,这需要大量的技巧。您无法验证部分缓冲区。您不能安全地跟踪对其他表的引用等。

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

此外,不要对 offset/length 数据使用 double,请使用适当大小的整数类型。