婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MongoDB游標超時問題的4種解決方法

MongoDB游標超時問題的4種解決方法

熱門標簽:外呼線路資源屬于電信業務嗎 內蒙古營銷智能外呼系統哪個好 crm外呼系統聯系方式 小裙科技電銷機器人怎樣 長沙電銷外呼防封卡是什么 河南電話外呼系統招商 青白江400企業電話申請 呼和浩特外呼系統原理是什么 智能外呼系統官網

當我們使用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種辦法:

  1. 修改MongoDB的配置,延長游標超時時間,并重啟MongoDB。由于生產環境的MongoDB不能隨便重啟,所以這個方案雖然有用,但是排除。
  2. 一次性把數據全部讀取下來,再做處理:
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參數了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • mongodb數據庫游標的使用淺析
  • MongoDB中游標的深入學習
  • MongoDB 游標詳解及實例代碼
  • MongoDB入門教程之聚合和游標操作介紹

標簽:黃石 池州 呼倫貝爾 白山 楚雄 安順 舟山 菏澤

巨人網絡通訊聲明:本文標題《MongoDB游標超時問題的4種解決方法》,本文關鍵詞  MongoDB,游標,超時,問,題的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MongoDB游標超時問題的4種解決方法》相關的同類信息!
  • 本頁收集關于MongoDB游標超時問題的4種解決方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲精品中文在线观看| 日本一区二区成人| 在线视频一区二区三区| 欧美日韩国产高清一区二区 | 美女尤物国产一区| 国产精品自拍在线| 色综合一个色综合亚洲| 日韩视频一区在线观看| 国产精品你懂的在线| 日韩在线一二三区| 9l国产精品久久久久麻豆| 欧美日本免费一区二区三区| 久久精品欧美日韩精品| 天天操天天色综合| 97久久超碰国产精品| 精品国产免费视频| 一区二区三区在线免费播放| 国产精品正在播放| 日韩情涩欧美日韩视频| 亚洲精品你懂的| 国产jizzjizz一区二区| 91麻豆精品国产自产在线观看一区 | 欧美一区二区三区视频在线| 国产精品久久久久久久久免费桃花 | 亚洲精品一区二区三区蜜桃下载| 亚洲天堂a在线| 国产在线不卡一区| 欧美日韩精品欧美日韩精品 | 国产精品欧美久久久久无广告| 亚洲成人自拍偷拍| 91视频精品在这里| 国产精品理论片| 国产乱子伦视频一区二区三区| 51久久夜色精品国产麻豆| 一区二区三区精品久久久| 9久草视频在线视频精品| 国产喂奶挤奶一区二区三区| 美女脱光内衣内裤视频久久网站| 欧美美女黄视频| 亚洲成人av中文| 在线国产亚洲欧美| 日韩理论在线观看| 99国产精品久久久久久久久久久 | 欧美韩国一区二区| 美国毛片一区二区三区| 在线播放视频一区| 日韩精品乱码免费| 欧美一区二区视频在线观看| 亚洲chinese男男1069| 欧美做爰猛烈大尺度电影无法无天| 国产精品福利av| av福利精品导航| 亚洲人精品午夜| 北条麻妃一区二区三区| 国产精品久久久久永久免费观看| 高清不卡一区二区在线| 国产精品免费观看视频| 99精品欧美一区| 亚洲欧美日韩中文字幕一区二区三区| 99re成人精品视频| 中文一区一区三区高中清不卡| 成人一级视频在线观看| 亚洲国产高清在线| 99riav一区二区三区| 国产精品福利影院| 日本久久电影网| 视频一区在线播放| 国产精品国产三级国产aⅴ无密码| 精品视频在线免费观看| 欧美一区二区三区的| 日本福利一区二区| 欧美日韩精品一区二区在线播放| 91看片淫黄大片一级在线观看| 成人免费视频一区二区| 成年人午夜久久久| 91麻豆精品国产91久久久久久久久| 高清不卡在线观看| 欧美极品aⅴ影院| 一区二区三区欧美在线观看| 精品视频色一区| 麻豆freexxxx性91精品| 国产情人综合久久777777| 成人app软件下载大全免费| 亚洲女同ⅹxx女同tv| 欧美视频在线观看一区| 国内精品写真在线观看| 亚洲欧美色一区| 欧美一区二区视频网站| www.欧美色图| 人妖欧美一区二区| 国产精品久久久久久亚洲毛片| 精品视频一区二区三区免费| 国产精品亚洲综合一区在线观看| 亚洲精选一二三| 精品美女一区二区三区| 91福利视频久久久久| 国产精品综合网| 三级一区在线视频先锋| 日韩理论片一区二区| 精品久久免费看| 欧美主播一区二区三区美女| 激情久久五月天| 亚洲成人激情av| 中文字幕 久热精品 视频在线| 91精品国产麻豆国产自产在线| 国产69精品久久99不卡| 蜜臀精品久久久久久蜜臀 | 日本在线不卡视频| 亚洲欧洲av色图| 久久久久久97三级| 日韩欧美国产精品| 欧美午夜寂寞影院| 色综合久久精品| 丁香桃色午夜亚洲一区二区三区| 图片区小说区区亚洲影院| 国产精品国产三级国产专播品爱网 | 在线观看亚洲成人| 久久久久国产精品麻豆| 国产精品99久久久久久久vr| 国产欧美一区二区在线观看| 色妹子一区二区| 麻豆91精品91久久久的内涵| 亚洲已满18点击进入久久| 日韩欧美一区二区久久婷婷| 99视频精品全部免费在线| 狠狠色狠狠色合久久伊人| 亚洲国产综合色| 亚洲精品国产一区二区三区四区在线| 国产亚洲一二三区| 欧美精品一区二区三区高清aⅴ | 日本道免费精品一区二区三区| 国产999精品久久久久久绿帽| 久久国产福利国产秒拍| 日韩精品一卡二卡三卡四卡无卡| 亚洲午夜久久久| 亚洲综合免费观看高清完整版| 亚洲另类春色校园小说| 亚洲激情图片小说视频| 亚洲精品va在线观看| 亚洲专区一二三| 亚洲成人tv网| 男女男精品视频| 国内欧美视频一区二区 | 国产乱码精品一区二区三区av| 欧美福利视频导航| 欧美视频精品在线观看| 欧美日韩免费高清一区色橹橹 | 久久99日本精品| 久久国产精品区| 国产乱子伦一区二区三区国色天香| 国产一区二区免费看| 国产suv精品一区二区6| 91在线高清观看| 欧美视频你懂的| 日韩女优视频免费观看| 国产成人在线视频免费播放| 亚洲福利视频一区| 激情综合网av| 国产在线播精品第三| 午夜成人免费视频| 亚洲一区二区在线免费观看视频| 日韩一区日韩二区| 亚洲线精品一区二区三区| 亚洲高清免费观看高清完整版在线观看| 中文字幕日韩一区| 一区二区三区四区蜜桃| 国产91精品露脸国语对白| 久国产精品韩国三级视频| 国产在线一区二区| av高清不卡在线| 6080yy午夜一二三区久久| 久久综合狠狠综合久久综合88| 国产精品电影一区二区三区| 一二三区精品福利视频| 奇米精品一区二区三区在线观看一 | 色综合久久中文综合久久牛| 欧美日韩www| 久久久不卡影院| 亚洲3atv精品一区二区三区| 国产成人免费网站| 欧美日韩一区精品| 国产日产欧美一区二区三区| 亚洲线精品一区二区三区| 国产成人夜色高潮福利影视| 欧美片网站yy| 一区二区三区中文字幕| 国产乱子轮精品视频| 欧美肥胖老妇做爰| 日韩毛片精品高清免费| 国产精品一区二区在线播放 | 麻豆精品新av中文字幕| 菠萝蜜视频在线观看一区| 日韩欧美激情四射| 一级做a爱片久久| 成人禁用看黄a在线| 日韩精品一区二区三区在线播放 | 91 com成人网| 亚洲精品高清在线观看| 国产精品白丝av| 日韩欧美精品在线视频|