如何流处理大于 RAM 的平面缓冲区?
How to stream process a flatbuffer bigger than RAM?
我们有以下场景:
- 我们正在 仅允许静态内存分配 的环境中构建平面缓冲区应用程序。
- 我们传入的平面缓冲区包含软件更新映像,这些映像比我们在处理单元上的整个可用 RAM 还要大。
- 我们需要对传入的平面缓冲区进行部分处理,并将图像流式传输到另一个单元进行存储。
- 处理单元没有持久存储,我们不能转储大平面缓冲区并利用
mmap()
。
- 我们想利用
flatbuffers::Verifier
class 来检查我们收到的 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
}
我们需要部分处理平面缓冲区。
我们能做什么?
使用 FlatBuffers 没有优雅的方法可以做到这一点,这需要大量的技巧。您无法验证部分缓冲区。您不能安全地跟踪对其他表的引用等。
如果要流式传输,请将每条数据放入其自己的适合 ram 的 FlatBuffer 中,然后流式传输一系列此类缓冲区。您可以使用 SizePrefixed
功能使这些缓冲区易于流式传输。您可以使用 file_identifier
来识别不同种类的缓冲区。
此外,不要对 offset/length 数据使用 double
,请使用适当大小的整数类型。
我们有以下场景:
- 我们正在 仅允许静态内存分配 的环境中构建平面缓冲区应用程序。
- 我们传入的平面缓冲区包含软件更新映像,这些映像比我们在处理单元上的整个可用 RAM 还要大。
- 我们需要对传入的平面缓冲区进行部分处理,并将图像流式传输到另一个单元进行存储。
- 处理单元没有持久存储,我们不能转储大平面缓冲区并利用
mmap()
。 - 我们想利用
flatbuffers::Verifier
class 来检查我们收到的 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
}
我们需要部分处理平面缓冲区。 我们能做什么?
使用 FlatBuffers 没有优雅的方法可以做到这一点,这需要大量的技巧。您无法验证部分缓冲区。您不能安全地跟踪对其他表的引用等。
如果要流式传输,请将每条数据放入其自己的适合 ram 的 FlatBuffer 中,然后流式传输一系列此类缓冲区。您可以使用 SizePrefixed
功能使这些缓冲区易于流式传输。您可以使用 file_identifier
来识别不同种类的缓冲区。
此外,不要对 offset/length 数据使用 double
,请使用适当大小的整数类型。