亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

MongoDB游標超時的情況怎樣解決?

2024-09-07 00:22:29
字體:
來源:轉載
供稿:網友
      本文主要給大家分享關于MongoDB游標超時問題的解決辦法,小編認為是比較實用的,有這方面學習需要的朋友可以看看,希望大家閱讀完這篇文章之后大有收獲。
 
       當我們使用Python從MongoDB里面讀取數據時,可能會這樣寫代碼:
import pymongo
 
handler = pymongo.MongoClient().db.col
 
for row in handler.find():
 parse_data(row)
       短短4行代碼,讀取MongoDB里面的每一行數據,然后傳入parse_data做處理。處理完成以后再讀取下一行。邏輯清晰而簡單,能有什么問題?只要parse_data(row)不報錯,這一段代碼就完美無缺。但事實并非這樣。
 
       你的代碼可能會在for row in handler.find()這一行報錯。它的原因,說來話長。要解釋這個問題,我們首先就需要知道,handler.find()返回的并不是數據庫里面的數據,而是一個游標(cursor)對象。
 
       只有當你使用for循環開始迭代它的時候,游標才會真正去數據庫里面讀取數據。但是,如果每一次循環都連接數據庫,那么網絡連接會浪費大量時間。
 
       所以pymongo會一次性獲取100行,for row in handler.find()循環第一次的時候,它會連上MongoDB,讀取一百條數據,緩存到內存中。于是第2-100次循環,數據都是直接從內存里面獲取,不會再連接數據庫。
       當循環進行到底101次的時候,再一次連接數據庫,再讀取第101-200行內容……,這個邏輯非常有效地降低了網絡I/O耗時。但是,MongoDB默認游標的超時時間是10分鐘。10分鐘之內,必需再次連接MongoDB讀取內容刷新游標時間,否則,就會導致游標超時報錯:
 
pymongo.errors.CursorNotFound: cursor id 211526444773 not found
 
       所以,回到最開始的代碼中來,如果parse_data每次執行的時間超過6秒鐘,那么它執行100次的時間就會超過10分鐘。此時,當程序想讀取第101行數據的時候,程序就會報錯。
       為了解決這個問題,我們有4種辦法:
 
修改MongoDB的配置,延長游標超時時間,并重啟MongoDB。由于生產環境的MongoDB不能隨便重啟,所以這個方案雖然有用,但是排除。
一次性把數據全部讀取下來,再做處理:
all_data = [row for row in handler.find()]
 
for row in all_data:
 parse(row)
       這種方案的弊端也很明顯,如果數據量非常大,你不一定能全部放到內存里面。即使能夠全部放到內存中,但是列表推導式遍歷了所有數據,緊接著for循環又遍歷一次,浪費時間。
 
  3.讓游標每次返回的數據小于100條,這樣消費完這一批數據的時間就會小于10分鐘:
 
# 每次連接數據庫,只返回50行數據
for row in handler.find().batch_size(50):
 parse_data(row)
       但這種方案會增加數據庫的連接次數,從而增加I/O耗時。
 
  4.讓游標永不超時。通過設定參數no_cursor_timeout=True,讓游標永不超時:
 
cursor = handler.find(no_cursor_timeout=True)
for row in cursor:
 parse_data(row)
cursor.close() # 一定要手動關閉游標
       然而這個操作非常危險,因為如果你的Python程序因為某種原因意外停止了,這個游標就再也無法關閉了!除非重啟MongoDB,否則這些游標會一直留在MongoDB上,占用資源。
       當然可能有人會說,使用try...except把讀取數據的地方包住,只要拋出了異常,在處理異常的時候關閉游標即可:
cursor = handler.find(no_cursor_timeout=True)
try:
 for row in cursor:
 parse_data(row)
except Exception:
 parse_exception()
finally:
 cursor.close() # 一定要手動關閉游標
       其中finally里面的代碼,無論有沒有異常,都會執行。但這樣寫會讓代碼非常難看。為了解決這個問題,我們可以使用游標的上下文管理器:
 
with handler.find(no_cursor_timeout=True) as cursor:
 for row in cursor:
  parse_data(row)
       只要程序退出了with的縮進,游標自動就會關閉。如果程序中途報錯,游標也會關閉。它的原理可以用下面兩段代碼來解釋:
 
class Test:
 def __init__(self):
  self.x = 1
 
 def echo(self):
  print(self.x)
 
 def __enter__(self):
  print('進入上下文')
  return self
 
 def __exit__(self, *args):
  print('退出上下文')
  
with Test() as t:
 t.echo()
print('退出縮進')
       運行效果如下圖所示:
 
 
 
       接下來在with的縮進里面人為制造異常:
class Test:
 def __init__(self):
  self.x = 1
 
 def echo(self):
  print(self.x)
 
 def __enter__(self):
  print('進入上下文')
  return self
 
 def __exit__(self, *args):
  print('退出上下文')
  
with Test() as t:
 t.echo()
 1 + 'a' # 這里一定會報錯
print('退出縮進')
 
 
       無論在with的縮進里面發生了什么,Test這個類中的__exit__里面的代碼始終都會運行。我們來看看pymongo的游標對象里面,__exit__是怎么寫的,如下圖所示:
 
       可以看到,這里正是關閉游標的操作。因此,如果我們使用上下文管理器,就可以放心大膽地使用no_cursor_timeout=True參數了。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线观看电影| 亚洲韩国日本中文字幕| 欧美日韩国产成人高清视频| 青青久久aⅴ北条麻妃| 国产成人福利夜色影视| 国产精品专区第二| 国产一区欧美二区三区| 日韩暖暖在线视频| 久久久久久免费精品| 69av成年福利视频| 欧美性一区二区三区| 国产一区二区色| 亚洲国产福利在线| 欧亚精品中文字幕| 国产精品91久久久| 精品国产乱码久久久久久虫虫漫画| 日韩在线视频免费观看高清中文| 国产视频丨精品|在线观看| 98视频在线噜噜噜国产| 最新国产精品亚洲| 亚洲free嫩bbb| 欧美另类xxx| 久久999免费视频| 日韩av综合网| 精品视频久久久久久| 欧美日韩裸体免费视频| 97avcom| 日韩精品在线看| 国产精品白嫩初高中害羞小美女| 色偷偷88888欧美精品久久久| 国产女精品视频网站免费| 日韩免费观看在线观看| 成人激情在线观看| 欧美亚洲成人精品| 在线观看视频亚洲| 亚洲最大的成人网| 成人97在线观看视频| 91精品国产综合久久香蕉最新版| 成人性生交大片免费观看嘿嘿视频| 欧美成年人视频网站| 中文字幕亚洲综合久久| 4438全国成人免费| 欧美大片在线看免费观看| 亚洲网站在线播放| 亚洲人成电影网站| 精品国产乱码久久久久久虫虫漫画| 国产精品久久久久久久久| 久久免费视频网站| 最近更新的2019中文字幕| 亚洲人成电影在线| 欧美一级淫片丝袜脚交| 成人国产精品免费视频| 亚洲成人激情在线| 国产精品网红直播| 欧美日韩中文在线观看| 美女黄色丝袜一区| 久久精视频免费在线久久完整在线看| 色综合视频一区中文字幕| 久久久精品视频成人| 国产香蕉97碰碰久久人人| 久久97久久97精品免视看| 91网站免费观看| 亚洲美女自拍视频| 97视频免费在线看| 国产欧美日韩精品在线观看| 国产精品小说在线| 国产97在线|日韩| 欧美在线性爱视频| 色偷偷91综合久久噜噜| 日本欧美一级片| 国产精品激情自拍| 欧美黄色成人网| 亚洲午夜未满十八勿入免费观看全集| 不卡av电影在线观看| 在线国产精品播放| 国产成人精品久久二区二区| 国产精品欧美日韩久久| 97国产在线观看| 日韩av在线高清| 精品国内产的精品视频在线观看| 国产手机视频精品| 精品国内自产拍在线观看| 久久99热这里只有精品国产| 午夜精品久久久久久久白皮肤| 日韩精品中文字幕在线| 国产欧美欧洲在线观看| 91视频国产高清| 国产精品麻豆va在线播放| 中文字幕在线视频日韩| 亚洲免费一在线| 亚洲美女av网站| 亚洲激情自拍图| 国产精品免费久久久久影院| 欧美一级淫片aaaaaaa视频| 在线精品高清中文字幕| 欧美一级淫片aaaaaaa视频| 尤物精品国产第一福利三区| 高清视频欧美一级| 亚洲第一区中文字幕| 欧美另类第一页| 久久久精品电影| 亚洲欧美日韩国产中文专区| 国产亚洲精品久久| 久久久国产精彩视频美女艺术照福利| 国产精品黄色影片导航在线观看| 国产精品高清网站| 国产伊人精品在线| 裸体女人亚洲精品一区| 亚洲免费视频网站| 91精品国产91久久久久久不卡| 色黄久久久久久| 中文一区二区视频| 日韩在线播放视频| 在线中文字幕日韩| 欧美理论电影网| www欧美xxxx| 亚洲第一免费播放区| 色天天综合狠狠色| 97国产精品视频人人做人人爱| 中文字幕av一区二区三区谷原希美| 69av在线视频| 亚洲热线99精品视频| 亚洲精品一区二区网址| 国产欧美日韩中文| 精品香蕉在线观看视频一| 亚洲欧洲一区二区三区久久| 亚洲一区二区三区久久| 性欧美xxxx交| 欧美一级高清免费播放| 日韩av在线网站| 国产精品久久91| 午夜精品久久久99热福利| 欧美在线视频免费观看| 国产美女久久精品香蕉69| 国产在线精品一区免费香蕉| 久久精品中文字幕| 91成品人片a无限观看| 色伦专区97中文字幕| 国产成人jvid在线播放| 日韩免费在线观看视频| 久久久久久久色| 久久久www成人免费精品张筱雨| 久久精品电影网站| 国产亚洲精品综合一区91| 国产视频亚洲精品| 久久躁日日躁aaaaxxxx| 国内精品中文字幕| 国产精品久久久久久久久男| www日韩中文字幕在线看| 国产丝袜一区二区三区| 一区二区三区日韩在线| 亚洲性69xxxbbb| 91香蕉嫩草影院入口| 欧美激情videoshd| 最近2019年手机中文字幕| 国产精品久久久一区| 成人黄色在线播放| 日韩欧美精品网址| 久久久久免费精品国产| 欧美大片大片在线播放| 国产999精品久久久| 最近2019中文免费高清视频观看www99| 精品久久香蕉国产线看观看gif| 欧美精品激情在线|