0

我面临的问题是 BSON 带有 ObjectId 和 Timestamp ,它们在 Messagepack 中不受支持,并且无法为 Messagepack 定义自定义序列化程序(至少据我所知)。
我写了一段 python 代码来比较 pymongo 的 BSON 和 msgpack。在没有太多优化的情况下,我可以实现 300% 的性能提升。那么,有没有办法将 BSON 转换为 Messagepack?

4

1 回答 1

1

这是我解决问题的方法。
不幸的是,由于 mongodb none-REST API 没有用于文档检索的 Strict 或 JS 模式(与其 REST API 不同,您可以在其中指定要用于检索文档的格式),我们别无选择但要手动进行转换。

import json    
from bson import json_util
import msgpack

con = Connection()
db = con.test
col = db.collection
d = col.find().limit(1)[0]

s = json.dumps(d, default=json_util.default) # s is in JSON compatibale format (ObjcetId => '$0id'
packer= msgpack.Packer()
packer.pack(s) # messagepack can successfully convert since the format is JSON compatible.

令人敬畏的观察是,即使增加了 json.dumps 一步,Messagepack 序列化程序也比 BSON 编码快,但不是 3 倍。对于 10000 次重复,差异是十分之三秒。

于 2012-10-28T13:59:50.300 回答