【pymongo.errors】Cursor 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的过程中,逻辑上报错,直接跳出,那么此时游标仍然处于打开的状态?
最新文章
- python网络编程【一】
- [UCSD白板题] Fractional Knapsack
- Git命令之从GitHub上下载开源项目
- KVC浅析和实例
- MySQL性能优化之max_connections配置参数浅析
- Python中itertools模块
- [iOS 多线程 &; 网络 - 1.3] - NSOperation
- GIS科研站
- codeforces C. Jzzhu and Chocolate
- C#中静态方法和非静态方法的区别(二)
- 【USACO 2.3.3】零数列
- LCA 最近公共祖先 tarjan离线 总结 结合3个例题
- 实验:体会Oracle权限/角色赋予的差异
- 自学Zabbix1.2-zabbix特性
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
- pythonのsqlalchemy外键关联查询
- Rplidar学习(四)—— ROS下进行rplidar雷达数据采集源码分析
- grep 详解
- 记安装ubuntu server和一些程序
- 如何使Ubuntu Linux12.04 LTS版可以用root用户登陆