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的过程中,逻辑上报错,直接跳出,那么此时游标仍然处于打开的状态?

最新文章

  1. python网络编程【一】
  2. [UCSD白板题] Fractional Knapsack
  3. Git命令之从GitHub上下载开源项目
  4. KVC浅析和实例
  5. MySQL性能优化之max_connections配置参数浅析
  6. Python中itertools模块
  7. [iOS 多线程 & 网络 - 1.3] - NSOperation
  8. GIS科研站
  9. codeforces C. Jzzhu and Chocolate
  10. C#中静态方法和非静态方法的区别(二)
  11. 【USACO 2.3.3】零数列
  12. LCA 最近公共祖先 tarjan离线 总结 结合3个例题
  13. 实验:体会Oracle权限/角色赋予的差异
  14. 自学Zabbix1.2-zabbix特性
  15. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
  16. pythonのsqlalchemy外键关联查询
  17. Rplidar学习(四)—— ROS下进行rplidar雷达数据采集源码分析
  18. grep 详解
  19. 记安装ubuntu server和一些程序
  20. 如何使Ubuntu Linux12.04 LTS版可以用root用户登陆

热门文章

  1. Spark流式编程介绍 - 编程模型
  2. vue路由传参的三种方式以及解决vue路由传参页面刷新参数丢失问题
  3. c++的构造和析构
  4. Docker跨服务器通信Overlay解决方案(上) Consul单实例
  5. 使用maven搭建ssm框架环境
  6. Nacos(九):Nacos集群部署和遇到的问题
  7. 算法与数据结构基础 - 贪心(Greedy)
  8. 【原创】Linux Suspend流程分析
  9. (四)数据持久化(基于YesSql)
  10. FineReport - 项目连接Oracle数据库