2012-10-26 4 views
0

내가 직면하고있는 문제는 BSON이 Messagepack에서 지원되지 않는 ObjectId 및 Timestamp와 함께 제공되며 Messagepack에 대한 사용자 지정 serializer를 정의하는 것이 가능하다는 것입니다.
나는 pymongo의 BSON vs msgpack을 비교하기 위해 파이썬 코드 조각을 썼다. 최적화를 많이하지 않아도 300 %의 성능 향상을 달성 할 수있었습니다. BSON을 Messagepack으로 변환 할 수있는 방법이 있습니까?BSON to Messagepack

답변

1

다음은 문제를 해결 한 방법입니다.
불행히도 mongodb none-REST API에는 문서 검색을 위해 사용할 형식을 지정할 수있는 REST API와 달리 문서 검색을위한 Strict 또는 JS 모드가 제공되지 않으므로 옵션을 사용하지 않고 수동으로 변환합니다.

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 반복의 경우에는 그 차이가 3 분의 1 초입니다.