在探索flatbuffer库以进行快速序列化时,我注意到该库使用'Variable'AsNumpy()命令以非常快的方式将flatbuffer向量读入numpy数组,但我无法找到(在源代码中)用于将numpy序列化为flatbuffer的相应编码方法。
到目前为止,我似乎坚持他们的榜样:
for i in reversed(range(0, 10)):
builder.PrependByte(i)
这显然不太理想。相反,人们可以简单地在大多数数据向量上调用Numpy()并且效果很好。
有什么简单的我缺少或者这个功能是不可用的吗?
答案 0 :(得分:3)
我们可以这样做。考虑我们要在不使用bytesOfImage = testImage.tobytes()
的情况下编写PrependByte()
。
我们可以按照以下步骤操作:
确保使用StartVector
正确初始化构建器。
Image.ImageStartDataVector(builder, len(bytesOfImage))
这将head
移动len(bytesOfImage)
个字节或更多取决于对齐操作等。但我们不需要担心这一点,因为StartVector API会处理这些事情。我们只需要在StartVector()
致电后了解最新消息。
在写入Bytes数组之前,请先找到正确的标题。
builder.head = builder.head - len(bytesOfImage)
StartVector将head
移动到新位置,正如我们所知,flatbuffers以小端顺序写入数据,即[N,N-1,N-2,... 0]方式。因此,我们需要在写入之前从当前更新的头部返回位置len(bytesOfImage)
。
将数据复制到字节数组
builder.Bytes[builder.head : (builder.head + len(bytesOfImage))] = bytesOfImage
调用EndVector()
以确保将头部移动到正确位置以便将来写入。
data = builder.EndVector(len(bytesOfImage))
答案 1 :(得分:0)
请参阅此stackoverflow链接以获取解决方法并监视功能是否已更新:
https://github.com/google/flatbuffers/issues/4668#issuecomment-372430117