快速 Python 序列化到 Flatbuffer?

Fast Python Serialize to Flatbuffer?

在探索用于快速序列化的 flatbuffer 库时,我注意到该库有一种非常快速的方法可以使用 'Variable'AsNumpy() 命令将 flatbuffer 向量读入 numpy 数组,但我一直无法找到(在source) 相应的编码方法,用于将 numpy 序列化为 flatbuffer。

到目前为止,我似乎坚持他们的例子:

for i in reversed(range(0, 10)):
  builder.PrependByte(i)

这显然不理想。相反,可以简单地在大多数数据向量上调用 toNumpy() 并且效果很好。

我是否遗漏了一些简单的东西,或者此功能是否不可用?

请参阅此 Whosebug link 了解解决方法并监控该功能是否已更新:

https://github.com/google/flatbuffers/issues/4668#issuecomment-372430117

我们可以按如下方式进行。考虑我们想写 bytesOfImage = testImage.tobytes() 而不使用 PrependByte().

我们可以按照以下步骤进行:

  1. 确保构建器已使用 StartVector 正确初始化。

    Image.ImageStartDataVector(builder, len(bytesOfImage))
    

    这会将 head 移动 len(bytesOfImage) 个字节或更多取决于对齐操作等。但是我们不需要担心这个,因为 StartVector API 会处理这些东西。我们只需要在 StartVector() 调用后知道最新的头。

  2. 在写入 Bytes 数组之前寻找 header 更正的位置。

    builder.head = builder.head - len(bytesOfImage)
    

    StartVector 将 head 移动到新位置,正如我们所知,flatbuffers 以小端顺序写入数据,即 [N, N-1, N-2,.....0] 方式。所以我们需要在写入之前从当前更新的磁头回到位置len(bytesOfImage)

  3. 将数据复制到字节数组中

    builder.Bytes[builder.head : (builder.head + len(bytesOfImage))] = bytesOfImage
    
  4. 调用 EndVector() 以确保磁头移动到正确的位置以供将来写入。

    data = builder.EndVector(len(bytesOfImage))