【问题标题】:Fast Python Serialize to Flatbuffer?快速 Python 序列化到 Flatbuffer?
【发布时间】:2018-03-12 15:47:15
【问题描述】:

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

到目前为止,我似乎对他们的例子感到困惑:

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

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

我缺少一些简单的东西还是这个功能不可用?

【问题讨论】:

  • 它可能不可用。我建议在这里github.com/google/flatbuffers/pull/4390 ping @kbrose 或在新问题中查看是否有人想添加它。
  • 公平。我目前希望探索使用构建器类的“内部” CreateByteVector() 函数,以构建一个函数,该函数采用 numpy.ndarray.tobytes() 的快速序列化并以这种方式进行。但是,嵌套断言语句存在问题。我确实计划请求该功能,但同时需要立即进行某些操作。

标签: python flatbuffers


【解决方案1】:

我们可以这样做。考虑我们想写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))
    

【讨论】:

  • 很高兴你能成功。为了将来,我会接受你的回答,但人们也应该注意 github 问题。
【解决方案2】:

查看此 stackoverflow 链接以了解解决方法并监控功能是否已更新:

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

【讨论】:

  • 嗨,你搞定了吗?在准备大 blob 时,我也在寻找有效的写入操作。但它对我不起作用。 :(你能和我分享你的发现吗?
  • @AmitSharma 作为链接,github 提到了字节的直接访问。是的,它是“hackish”,但这是我们在 1.5 个月内所做的并且没有任何问题。尽管我们最近出于不相关的性能原因切换到了 protobuffers。
  • 感谢您的回复。我正在尝试相同的方法,但它不是直截了当,不适合我;可能是因为我有复杂的架构..
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多