快速 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()
.
我们可以按照以下步骤进行:
确保构建器已使用 StartVector
正确初始化。
Image.ImageStartDataVector(builder, len(bytesOfImage))
这会将 head
移动 len(bytesOfImage)
个字节或更多取决于对齐操作等。但是我们不需要担心这个,因为 StartVector API 会处理这些东西。我们只需要在 StartVector()
调用后知道最新的头。
在写入 Bytes 数组之前寻找 header 更正的位置。
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))
在探索用于快速序列化的 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()
.
我们可以按照以下步骤进行:
确保构建器已使用
StartVector
正确初始化。Image.ImageStartDataVector(builder, len(bytesOfImage))
这会将
head
移动len(bytesOfImage)
个字节或更多取决于对齐操作等。但是我们不需要担心这个,因为 StartVector API 会处理这些东西。我们只需要在StartVector()
调用后知道最新的头。在写入 Bytes 数组之前寻找 header 更正的位置。
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))