gpt4 book ai didi

flatbuffers - 如何流处理大于 RAM 的 FlatBuffers ?

转载 作者:行者123 更新时间:2023-12-05 04:01:23 27 4
gpt4 key购买 nike

我们有以下场景:

  • 我们正在仅允许静态内存分配 的环境中构建 FlatBuffers 应用程序。
  • 我们传入的 FlatBuffers 包含软件更新图像,这些图像比我们在处理单元上的整个可用 RAM 还要大。
  • 我们需要部分处理传入的 FlatBuffers ,并将图像流式传输到另一个单元进行存储。
  • 处理单元没有持久存储,我们不能转储大 FlatBuffers 并利用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
}

我们需要部分处理 FlatBuffers 。我们能做什么?

最佳答案

使用 FlatBuffers 没有优雅的方法来做到这一点,它需要大量的 hack。您无法验证部分缓冲区。您不能安全地遵循对其他表的引用等。

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

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

关于flatbuffers - 如何流处理大于 RAM 的 FlatBuffers ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55509088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com