国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數據庫 > 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參數了。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产精品18久久久久久久久久| 青青草免费观看免费视频在线| 麻豆视频在线观看免费网站| 在线视频福利| 任你操视频在线观看| 日本片在线看| 天堂在线视频| 国产成人精品18| eeuss影院网站免费观看| 91精选福利| 日本不卡1区2区3区| 福利视频网址导航| 精精国产xxxx视频在线动漫| www.xxx黄| 国产偷倩在线播放| 夜夜嗨yeyeh| 中文字幕中文字幕在线中高清免费版| 国产网友自拍视频导航网站在线观看| 国产成人久久精品77777| 人人在线视频| 在线欧美一级视频| 国产午夜精品一区理论片| 亚洲一本大道| 国产一卡2卡3卡4卡网站免费| 精品极品三级久久久久| 欧美日韩一区二区三区视视频| 国产特级嫩嫩嫩bbb| 性网站在线播放| 国产人成在线观看| 国产秒拍福利视频露脸| 四虎成年永久免费网站| 97福利电影| 国产精品久久久久永久免费看| 青青草在线播放| 99热99re6国产在线播放| 天堂在线看视频| 激情六月婷婷| 日本国产在线| 日本成人a视频| 精品成人免费自拍视频| 国产视频1区| 国产视频xxxx| 综合蜜桃精品| 1区不卡电影| 中文字幕日本三级| 九九热视频在线观看| 青青草免费在线视频| 午夜在线不卡| 九色视频网站| 国产视频三区| 精品美女调教视频| 国产视频一二区| 国产精品ⅴa有声小说| 国产精品久久久久久精| 最近最好的中文字幕2019免费| av麻豆国产| 免费黄网站在线观看| 免费一区二区三区视频狠狠| 国产主播福利在线| 国产素人视频在线观看| 国产三级视频在线播放线观看| 国产黄色大片在线观看| 伊人色综合网| 福利在线视频导航| 最近中文字幕大全中文字幕免费 | a中文在线播放| а√最新版在线天堂| 国产在线观看av| 国产精品剧情一区二区在线观看 | 狠狠干在线视频| 国产一区二区三区美女秒播| 精品99又大又爽又硬少妇毛片| 日本成a人片在线观看| 中文字幕视频免费在线观看| 一本大道久久a久久精品| 国产精品亚洲第五区在线| 国产高清在线观看| 国产专区在线| 伊人影院在线观看| 最近中文字幕mv2018在线高清| 精品麻豆一区二区三区| 免费a级毛片在线观看| 91麻豆福利| 国产精品入口麻豆免费| 欧美a免费在线| 亚洲va国产日韩欧美精品色婷婷| 国产网站av| 国产九色在线| 超碰免费在线播放| 亚洲视频手机在线观看| 国产欧美在线观看视频| 国产在线观看91| av在线不卡网站| 国产福利在线观看| 中文字幕国产视频| 国产蜜臀在线| 激情丁香婷婷| 国产91大片| 精品资源在线看| 麻豆精品免费视频入口| 热99re久久精品这里都是免费| 伊人网在线免费观看| 99在线播放| 99re热在线观看| 伊人永久在线| 日本一级理论片在线大全| av亚洲男人天堂| 色吊丝av中文字幕| 欧美日韩不卡中文字幕在线| av在线电影观看| 狠狠干天天干| 五月婷婷丁香激情| 国产秀色在线www免费观看| 国产麻豆一级片| 中文字幕在线第一页| 国产日产精品久久久久久婷婷| 国产私人影院| 四虎成人欧美精品在永久在线| av三级在线观看| 高清av中文在线字幕观看1| 中文字幕在线播放网址| 国产二级片在线| 日韩不卡高清| 成人av小说网| 精品国产免费观看一区| 青娱乐在线视频观看| 中文字幕中文字幕在线中高清免费版| 国产日韩欧美第一页| 午夜在线视频| 国产黄色av免费看| 激情亚洲综合网| 国产亚洲精品自在线观看| 中文在线视频观看| 国产性一级片| 黄色av网站在线| 亚洲网站视频在线观看| 国产在线一区二区视频| 精品国产一区二区三区不卡在线| 日本在线观看| 国产不卡在线| 午夜av在线免费观看| www.操操操.com| 国产l精品国产亚洲区在线观看| 欧美精品se| 四虎成人精品在永久在线观看| 1区2区3区在线| 青青草原国产在线| 樱花草在线观看www| 国产精品久久久久久福利| 黄色一级片视频| 麻豆国产在线视频| wwwww在线观看免费视频| 7777在线| 2019年中文字幕| 国产婷婷视频在线| **三级三级97片毛片| 国产久草在线| **三级三级97片毛片| 国产网站免费看| 国产区视频在线观看| 国产xxx在线| 精品孕妇一区二区三区| 在线免费观看你懂的| 国产网站免费看| 国产一二三在线观看| 超碰在线97国产| 狠狠干五月天| 豆国产97在线|亚洲| 在线āv视频| 一区二区精品区| 亚洲综合天堂网| 亚洲日本伊人| 亚洲精品一线| 免费高清视频日韩| 黄色激情网址| 国产亚洲精品午夜高清影院| 国产日本在线| 精品亚洲综合| 操人视频91| 国产一卡2卡3卡4卡网站免费| 国产视频三区| 日本一二区视频| 九九热在线视频| 国产美女性感在线观看懂色av| japanese色国产在线看视频| 九九热免费在线视频| 国产香蕉免费精品视频| 在线中文字幕第一页| 免费国产阿v视频在线观看| 国产麻豆精品视频一区二区 | 精品一区二区三区在线成人| 亚洲欧洲成人| 日本最新在线视频| 精品视频在线一区二区| 青青草原av在线| 精品国产高清a毛片无毒不卡| 亚洲精品白浆| 国产女主播在线| 超碰免费在线观看| 中文av在线播放|