【问题标题】:Traversing pymongo curser taking infinite time遍历 pymongo 游标需要无限时间
【发布时间】:2019-08-22 13:34:29
【问题描述】:

我正在使用 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)

('开始', datetime.datetime(2019, 4, 1, 16, 59, 3, 685992)) ('end', datetime.datetime(2019, 4, 1, 16, 59, 3, 686293)) 在没有文档遍历的情况下使用。

【问题讨论】:

  • 您针对哪个版本的 MongoDB 执行此操作?
  • MongoDB 版本:3.6.3

标签: mongodb python-2.7 pymongo


【解决方案1】:

根据您的描述,尤其是随着跳跃次数的增加,它的速度变慢了很多,我怀疑您正在点击this issue。查看票证中的描述并检查您是否看到大量扫描的对象/文档。根据我的经验,这可能是您遇到的问题 - 基本上 MongoDB 会在跳过文档之前获取文档。

如果确实如此,修复方法是升级到 3.6 的更高版本,因为此问题已在 3.6.9 中修复。

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2019-04-10
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2020-06-15
    • 2012-09-30
    相关资源
    最近更新 更多