快速Python序列化为Flatbuffer?

时间:2018-03-12 15:47:16

标签: python flatbuffers

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

到目前为止,我似乎坚持他们的榜样:

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

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

有什么简单的我缺少或者这个功能是不可用的吗?

2 个答案:

答案 0 :(得分:3)

我们可以这样做。考虑我们要在不使用bytesOfImage = testImage.tobytes()的情况下编写PrependByte()

我们可以按照以下步骤操作:

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

    Image.ImageStartDataVector(builder, len(bytesOfImage))
    

    这将head移动len(bytesOfImage)个字节或更多取决于对齐操作等。但我们不需要担心这一点,因为StartVector API会处理这些事情。我们只需要在StartVector()致电后了解最新消息。

  2. 在写入Bytes数组之前,请先找到正确的标题。

    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))
    

答案 1 :(得分:0)

请参阅此stackoverflow链接以获取解决方法并监视功能是否已更新:

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