mongodb - 遍历 pymongo 游标需要无限时间
问题描述
我正在使用 pymongo 从 mongo 服务器访问数据。服务器有数十亿个文档,所以我使用 find 和 skip 一次访问 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)
('start', datetime.datetime(2019, 4, 1, 16, 59, 3, 685992)) ('end', datetime.datetime(2019, 4, 1, 16, 59, 3, 686293)) 使用时没有文档遍历。
解决方案
根据您的描述,尤其是随着跳数的增加,它的速度会大大降低,我怀疑您遇到了这个问题。查看票证中的描述并检查您是否看到大量扫描的对象/文档。根据我的经验,这可能是您遇到的问题 - 基本上 MongoDB 是在跳过文档之前获取文档。
如果确实如此,则修复方法是升级到 3.6 的更高版本,因为此问题已在 3.6.9 中修复。
推荐阅读
- html - 折线图显示不正确
- python - Flask - 拥有多个静态文件夹(静态文件夹实际上是动态的)
- vb.net - 从 With VB.net 中引用一个类
- vba - 在文件夹中搜索时排除系统和打开的文件
- angular - 将输入数据绑定到模板中的 Angular 组件时,使用括号代替引号有什么作用?
- javascript - 轴改变旋转轴三个js
- javascript - 对话流:followEventInput
- java - Dropwizard 相当于 Spring 的 @Async
- docker - docker login 中的“保存凭据时出错”
- javascript - 在 TFS 仪表板小部件上使用 VSS 控件