1、使用MongoDB出现以下两种报错: (1)pymongo.errors.CursorNotFound: Cursor not found (2)pymongo.errors.AutoReconnect:: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。
2、原因 import pymongo client = pymongo.MongoClient() db = client['db_name'] data = db['col_name'] for i in data.find(): process() db.insert("检测样本",x)
mongo server默认维护连接的时间窗口是十分钟,单次从server获取数据是101条或者大于1M小于16M的数据。 所以默认情况下,如果10分钟内未能处理完数据,比如process太耗时,循环数大,则会出现处理超时的问题。
3、解决办法:为find函数设置 no_cursor_timeout = True,表示游标连接不会主动关闭,处理完成需要我们手动关闭 import pymongo client = pymongo.MongoClient() db = client['db_name'] col = dbData['col_name']
data = col.find(no_cursor_timeout = True)#处理超时的问题
for i in data.find(): process() db.insert("检测样本",x)
data.close() # 关闭游标
4、代码优化 我自己出现这个问题就是在频繁访问MongoDB的时候出现的,我的process并不长,循环数也不大,处理数据总量就几百,但依旧出现了超时,经过调试发现,db.insert直接访问数据库耗费太多时间,可以先将要插入的数据存入列表,最后才统一插入数据库。 (1)改进前: for i in data.find(): process() db.insert("检测样本",x) (2)改进后: dbList=[] for i in data.find(): process() dbList.append(x) db.insert("检测样本",dbList)
处理总时间从分钟降低为了几秒钟,提升很大!