从python直接访问msgpack' d元素N.

时间:2016-07-21 19:45:23

标签: python msgpack

我有一块msgpack&d;数据创建如下:

#!/usr/bin/env python

from io import BytesIO
import msgpack

packer = msgpack.Packer()
buf = BytesIO()

buf.write(packer.pack("foo"))
buf.write(packer.pack("bar"))
buf.write(packer.pack("baz"))

稍后在我的应用程序(或其他应用程序)中,我需要解压缩前两个元素,但希望访问第三个元素STILL打包。到目前为止,我发现这样做的唯一方法是重新打包第三个元素,如下所示,效率相当低。

buf.seek(0)
unpacker = msgpack.Unpacker(buf)
item1 = unpacker.unpack()
item2 = unpacker.unpack()
item3 = unpacker.unpack()

packed_item3 = msgpack.pack(item3)

这可以让我到达我想要的地方,但我更愿意直接访问这最后一项,这样我就可以把它传递到需要去的地方。

2 个答案:

答案 0 :(得分:0)

由于在执行msgpack后您的包不会是常量大小,因此您可以使用一组可识别的字节作为包的分隔符。 当你需要直接访问Nth pack时,仍然处于打包状态,你迭代你的字节数组,你的第N个包将位于第N-1个分隔符之后。 虽然这将具有O(n)复杂性,并且需要在整个bytearray上迭代,直到您需要的包。 带有“####”作为分隔符的字符串示例如下所示:

"pack1####pack2####pack3####pack4####pack5...."

答案 1 :(得分:0)

请参阅http://pythonhosted.org/msgpack-python/api.html#msgpack.Unpacker.skip

packed_item3 = None
def callback(b):
    global packed_item3
    packed_item3 = b
unpacker.skip(write_bytes=callback)

但不推荐使用write_bytes选项。其他msgpack实现没有这样的API。

更常见的方式是双重包装。

buf.write(msgpack.packb(msgpack.packb(item3))

通过这种方式,您可以在不解包的情况下获得packed_item3。 这种方式可以在其他msgpack实现中使用。

例如,流利者使用这种方式来实现高吞吐量。