部分報錯如下:
File "D:\anaconda\lib\site-packages\pymongo\cursor.py", line 1189, in next
if len(self.__data) or self._refresh():
File "D:\anaconda\lib\site-packages\pymongo\cursor.py", line 1126, in _refresh
self.__send_message(g)
File "D:\anaconda\lib\site-packages\pymongo\cursor.py", line 982, in __send_message
helpers._check_command_response(first)
File "D:\anaconda\lib\site-packages\pymongo\helpers.py", line 152, in _check_command_response
raise CursorNotFound(errmsg, code, response)
CursorNotFound: cursor id 33632884345 not found
我的操作方式是直接從一個集合中取出所有文檔(約1000條),然后依次對每條文檔進行操作,中間的操作耗時可能會很長(10分鍾以上)。
本來以為是長時間沒有操作導致游標自動關閉導致的,於是在find
函數中把no_cursor_timeout
設置為True
,然后在處理第101條記錄時候依然出現以上錯誤。網上搜索,得到來自CSDN的博文:
https://blog.csdn.net/zh0u_f/article/details/72897628
https://blog.csdn.net/gehaixia/article/details/50512549
這兩位博主提到:
默認 單次從 server獲取數據是101條或者 大於1M小於16M的數據
估計一個 batch 大小,讓 MongoDB 客戶端每次抓取的文檔在 10 分鍾內能用完,這樣客戶端就不得不 10 分鍾內至少聯系服務器一次,保證 cursor 不超時
於是知道原因就在這,因為只設置了超時參數並沒有解決問題,於是就再增加了batch_size
參數,我設置為5,再跑的時候,就可以了。
docs = db.collection.find(no_cursor_timeout=True, batch_size=5)