pymongo.errorsCursor not found

Posted beiyi888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pymongo.errorsCursor not found相关的知识,希望对你有一定的参考价值。

pymongo.errors.CursorNotFound: Cursor not found

故事背景:先从数据库中取得所有数据 db[‘test‘].find(),然后对结果进行for循环,但是当do_something函数耗时过长,在cursor上长时间没有进行操作,引发cursor在mongodb服务端超时。

技术图片

 

分析原因:你在用 db.collection.find() 的时候,它返回的不是所有的数据,而实际上是一个“cursor”。它的默认行为是:第一次向数据库查询 101 个文档,或 1 MB 的文档,取决于哪个条件先满足;之后每次 cursor 中的文档用尽后,查询 4 MB 的文档。另外,find() 的默认行为是返回一个 10 分钟无操作后超时的 cursor。如果我一个 batch 的文档十分钟内没处理完,过后再处理完了,再用同一个 cursor id 向服务器取下一个 batch,这时候 cursor id 当然已经过期了,这也就能解释为啥我得到 cursor id 无效的错误了。

 

思路总结:默认 mongo server维护连接的时间窗口是十分钟;默认 单次从 server获取数据是101条或者 大于1M小于16M的数据,所以默认情况下,如果10分钟内未能处理完数据,则抛出该异常。

 

解决方案:

1. 修改每批次获取数据量的条数,即batch size:

  collection.find(condition).batch_size(10)

  批量数需 估算十分钟内能处理的数据量

技术图片

 

 2.设置no_cursor_timeout = True,永不超时,游标连接不会主动关闭,需要手动关闭

  cursor=db.images.find(‘_id‘:0,no_cursor_timeout=True)

技术图片

 

 

笔者建议:感觉方案二不是很妥当,假设执行do_something的过程中,逻辑上报错,直接跳出,那么此时游标仍然处于打开的状态?

 

以上是关于pymongo.errorsCursor not found的主要内容,如果未能解决你的问题,请参考以下文章

遇到[0]:使用Not实现Not16时,可能无法使用内部节点的子总线

使用 ":not" 和 ".not()" 选择器之间的性能差异?

vs安装 products not found

ERROR_PATH_NOT_FOUND 与 ERROR_FILE_NOT_FOUND,有啥区别?

not a zip file (end header not found)

css [css :: not()]不包括选择器 - :not()。 #css