【问题标题】:How to close cursors in MongoDB如何在 MongoDB 中关闭游标
【发布时间】:2016-01-03 11:15:36
【问题描述】:

您好,我正在使用 mongo_collection.find() 从 mongdb 获取文档,此集合有 600k 文档。遍历 400k 文档后,我遇到了错误

Traceback (most recent call last):
  File "mongo_opp.py", line 324, in <module>
    obj.indexAnswer()
  File "mongo_opp.py", line 241, in indexAnswer
    for dict_result in result:
  File "build/bdist.linux-x86_64/egg/pymongo/cursor.py", line 1032, in next
  File "build/bdist.linux-x86_64/egg/pymongo/cursor.py", line 974, in _refresh
  File "build/bdist.linux-x86_64/egg/pymongo/cursor.py", line 864, in __send_message
  File "build/bdist.linux-x86_64/egg/pymongo/helpers.py", line 112, in _unpack_response
pymongo.errors.CursorNotFound: Cursor not found, cursor id: 83302133311

这个问题的解决方案是设置超时参数mongo_collection.find(timeout=False),我在下面的链接中找到了,

StackOveflowLink1

StacKOverflowLink2

设置超时参数会使游标无限时间打开,会影响系统性能。任何人都可以帮助我解决光标关闭连接。帮助表示赞赏:)

【问题讨论】:

    标签: mongodb python-2.7


    【解决方案1】:

    要关闭游标,您需要删除放置查询结果的变量

    del cursor
    

    cursor.close()
    

    您也可以通过选择较低的 batch_size 值来解决问题:

    (以 Pymongo 为例)

    col.find({}).batch_size(10)
    

    【讨论】:

      【解决方案2】:

      Python 使用引用计数来管理对象生命周期,当 Cursor 对象超出范围时,垃圾收集器会调用 __die() 来关闭游标。如果要显式控制,可以自己调用close()。

      Close() 在内部调用 __die()。检查 out

      【讨论】:

        【解决方案3】:

        您可以使用 del 关键字解决此问题

        result = mongo_collection.find(no_cursor_timeout=True)
        
        del result
        

        检查Link1Link2

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-28
          • 2014-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-26
          相关资源
          最近更新 更多