我正在使用pymongo从mongo服务器访问数据。服务器上有数十亿个文档,所以我一次使用查找和跳过来访问n个文档。我只需要访问那些具有“ sample_key_XYZ”作为_tag的文档。
print('start',datetime.datetime.now())
a=db.collection.find({"_tag":re.compile('latest')}).skip(2000000).limit(2000)
print('end',datetime.datetime.now())
它可以正常工作,光标在一秒钟内移动。但是,当我尝试访问数据时,它卡住了(执行需要花费数小时) 即
print('start',datetime.datetime.now())
a=db.collection.find({"_tag":re.compile('sampe_key')}).skip(2000000).limit(2000)
for doc in a:
print(doc["_tag"])
break
print('end',datetime.datetime.now())
但是如果我更改为一个较小的数字(2500),它的执行速度将非常快(1s)
('开始',datetime.datetime(2019,4,1,1,16,59,3,685992)) ('end',datetime.datetime(2019,4,1,1,16,59,3,686293)) 在没有文档遍历的情况下使用。
答案 0 :(得分:1)
根据您的描述,尤其是随着跳数的增加,它的速度大大降低,我怀疑您是在点击this issue。查看票证中的描述,并检查是否看到大量扫描的对象/文档。根据我的经验,这可能是您遇到的问题-基本上,MongoDB会先获取文档,然后再跳过它们。
如果确实如此,则修复程序将升级到3.6的更高版本,因为此问题已在3.6.9中修复。