遇到問題--python--mongodb--pymongo.errors.CursorNotFound: Cursor not found

情況

使用代碼如下:

import pymongo
client = pymongo.MongoClient()
db = client['db_name']
col = db['col_name']
demos = col.find({})

for cursor  in demos:
	deal_data_analysis(cursor)

報錯如下:

pymongo.errors.CursorNotFound: Cursor not found

原因分析

col.find()獲得的demos是cursor遊標位置,具體使用到某個數據時,纔會去查詢數據庫把數據拿出來。它返回的不是所有的數據,而實際上是一個“cursor”。

它的默認原理是 (具體數字需要查詢mongodb官網,不同版本默認的閾值有可能有差異) :第一次向數據庫查詢 101 個文檔,或 大於1M小於16M的數據文檔,取決於哪個條件先滿足;之後每次 cursor 中的文檔用盡後,查詢 4 MB 的文檔。

另外,find() 默認返回的是 一個 10 分鐘無操作後超時的 cursor。如果我一個 batch 的文檔十分鐘內沒處理完,過後再處理完了,再用同一個 cursor id 向服務器取下一個 batch,這時候 cursor id 當然已經過期了,這也就能解釋爲啥我得到 cursor id not found 無效的錯誤了。

思路總結:默認 mongo server維護連接的時間窗口是十分鐘;默認 單次從 server獲取數據是101條或者 大於1M小於16M的數據,所以默認情況下,如果10分鐘內未能處理完數據,則拋出該異常。

解決方式

解決的方式有以下幾種,適應不同場景,大家需要根據自己的應用場景進行選擇和調整參數:

方案一 使用batch_size()

demos
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章