亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法

MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法

熱門標(biāo)簽:外呼線路資源屬于電信業(yè)務(wù)嗎 內(nèi)蒙古營(yíng)銷智能外呼系統(tǒng)哪個(gè)好 crm外呼系統(tǒng)聯(lián)系方式 小裙科技電銷機(jī)器人怎樣 長(zhǎng)沙電銷外呼防封卡是什么 河南電話外呼系統(tǒng)招商 青白江400企業(yè)電話申請(qǐng) 呼和浩特外呼系統(tǒng)原理是什么 智能外呼系統(tǒng)官網(wǎng)

當(dāng)我們使用Python從MongoDB里面讀取數(shù)據(jù)時(shí),可能會(huì)這樣寫代碼:

import pymongo

handler = pymongo.MongoClient().db.col

for row in handler.find():
 parse_data(row)

短短4行代碼,讀取MongoDB里面的每一行數(shù)據(jù),然后傳入parse_data做處理。處理完成以后再讀取下一行。邏輯清晰而簡(jiǎn)單,能有什么問(wèn)題?只要parse_data(row)不報(bào)錯(cuò),這一段代碼就完美無(wú)缺。

但事實(shí)并非這樣。

你的代碼可能會(huì)在for row in handler.find()這一行報(bào)錯(cuò)。它的原因,說(shuō)來(lái)話長(zhǎng)。

要解釋這個(gè)問(wèn)題,我們首先就需要知道,handler.find()返回的并不是數(shù)據(jù)庫(kù)里面的數(shù)據(jù),而是一個(gè)游標(biāo)(cursor)對(duì)象。如下圖所示:

只有當(dāng)你使用for循環(huán)開(kāi)始迭代它的時(shí)候,游標(biāo)才會(huì)真正去數(shù)據(jù)庫(kù)里面讀取數(shù)據(jù)。

但是,如果每一次循環(huán)都連接數(shù)據(jù)庫(kù),那么網(wǎng)絡(luò)連接會(huì)浪費(fèi)大量時(shí)間。

所以pymongo會(huì)一次性獲取100行,for row in handler.find()循環(huán)第一次的時(shí)候,它會(huì)連上MongoDB,讀取一百條數(shù)據(jù),緩存到內(nèi)存中。于是第2-100次循環(huán),數(shù)據(jù)都是直接從內(nèi)存里面獲取,不會(huì)再連接數(shù)據(jù)庫(kù)。

當(dāng)循環(huán)進(jìn)行到底101次的時(shí)候,再一次連接數(shù)據(jù)庫(kù),再讀取第101-200行內(nèi)容……

這個(gè)邏輯非常有效地降低了網(wǎng)絡(luò)I/O耗時(shí)。

但是,MongoDB默認(rèn)游標(biāo)的超時(shí)時(shí)間是10分鐘。10分鐘之內(nèi),必需再次連接MongoDB讀取內(nèi)容刷新游標(biāo)時(shí)間,否則,就會(huì)導(dǎo)

致游標(biāo)超時(shí)報(bào)錯(cuò):

pymongo.errors.CursorNotFound: cursor id 211526444773 not found

如下圖所示:

所以,回到最開(kāi)始的代碼中來(lái),如果parse_data每次執(zhí)行的時(shí)間超過(guò)6秒鐘,那么它執(zhí)行100次的時(shí)間就會(huì)超過(guò)10分鐘。此時(shí),當(dāng)程序想讀取第101行數(shù)據(jù)的時(shí)候,程序就會(huì)報(bào)錯(cuò)。

為了解決這個(gè)問(wèn)題,我們有4種辦法:

  1. 修改MongoDB的配置,延長(zhǎng)游標(biāo)超時(shí)時(shí)間,并重啟MongoDB。由于生產(chǎn)環(huán)境的MongoDB不能隨便重啟,所以這個(gè)方案雖然有用,但是排除。
  2. 一次性把數(shù)據(jù)全部讀取下來(lái),再做處理:
all_data = [row for row in handler.find()]

for row in all_data:
 parse(row)

這種方案的弊端也很明顯,如果數(shù)據(jù)量非常大,你不一定能全部放到內(nèi)存里面。即使能夠全部放到內(nèi)存中,但是列表推導(dǎo)式遍歷了所有數(shù)據(jù),緊接著for循環(huán)又遍歷一次,浪費(fèi)時(shí)間。

  3.讓游標(biāo)每次返回的數(shù)據(jù)小于100條,這樣消費(fèi)完這一批數(shù)據(jù)的時(shí)間就會(huì)小于10分鐘:

# 每次連接數(shù)據(jù)庫(kù),只返回50行數(shù)據(jù)
for row in handler.find().batch_size(50): 
 parse_data(row)

但這種方案會(huì)增加數(shù)據(jù)庫(kù)的連接次數(shù),從而增加I/O耗時(shí)。

  4.讓游標(biāo)永不超時(shí)。通過(guò)設(shè)定參數(shù)no_cursor_timeout=True,讓游標(biāo)永不超時(shí):

cursor = handler.find(no_cursor_timeout=True)
for row in cursor:
 parse_data(row)
cursor.close() # 一定要手動(dòng)關(guān)閉游標(biāo)

然而這個(gè)操作非常危險(xiǎn),因?yàn)槿绻愕腜ython程序因?yàn)槟撤N原因意外停止了,這個(gè)游標(biāo)就再也無(wú)法關(guān)閉了!除非重啟MongoDB,否則這些游標(biāo)會(huì)一直留在MongoDB上,占用資源。

當(dāng)然可能有人會(huì)說(shuō),使用try...except把讀取數(shù)據(jù)的地方包住,只要拋出了異常,在處理異常的時(shí)候關(guān)閉游標(biāo)即可:

cursor = handler.find(no_cursor_timeout=True)
try:
 for row in cursor:
 parse_data(row)
except Exception:
 parse_exception()
finally:
 cursor.close() # 一定要手動(dòng)關(guān)閉游標(biāo)

其中finally里面的代碼,無(wú)論有沒(méi)有異常,都會(huì)執(zhí)行。

但這樣寫會(huì)讓代碼非常難看。為了解決這個(gè)問(wèn)題,我們可以使用游標(biāo)的上下文管理器:

with handler.find(no_cursor_timeout=True) as cursor:
 for row in cursor:
  parse_data(row)

只要程序退出了with的縮進(jìn),游標(biāo)自動(dòng)就會(huì)關(guān)閉。如果程序中途報(bào)錯(cuò),游標(biāo)也會(huì)關(guān)閉。

它的原理可以用下面兩段代碼來(lái)解釋:

class Test:
 def __init__(self):
  self.x = 1

 def echo(self):
  print(self.x)

 def __enter__(self):
  print('進(jìn)入上下文')
  return self

 def __exit__(self, *args):
  print('退出上下文')
  
with Test() as t:
 t.echo()
print('退出縮進(jìn)')

運(yùn)行效果如下圖所示:

接下來(lái)在with的縮進(jìn)里面人為制造異常:

class Test:
 def __init__(self):
  self.x = 1

 def echo(self):
  print(self.x)

 def __enter__(self):
  print('進(jìn)入上下文')
  return self

 def __exit__(self, *args):
  print('退出上下文')
  
with Test() as t:
 t.echo()
 1 + 'a' # 這里一定會(huì)報(bào)錯(cuò)
print('退出縮進(jìn)')

運(yùn)行效果如下圖所示:

無(wú)論在with的縮進(jìn)里面發(fā)生了什么,Test這個(gè)類中的__exit__里面的代碼始終都會(huì)運(yùn)行。

我們來(lái)看看pymongo的游標(biāo)對(duì)象里面,__exit__是怎么寫的,如下圖所示:

可以看到,這里正是關(guān)閉游標(biāo)的操作。

因此,如果我們使用上下文管理器,就可以放心大膽地使用no_cursor_timeout=True參數(shù)了。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • mongodb數(shù)據(jù)庫(kù)游標(biāo)的使用淺析
  • MongoDB中游標(biāo)的深入學(xué)習(xí)
  • MongoDB 游標(biāo)詳解及實(shí)例代碼
  • MongoDB入門教程之聚合和游標(biāo)操作介紹

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法》,本文關(guān)鍵詞  MongoDB,游標(biāo),超時(shí),問(wèn),題的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日韩中文字幕一区| 精品国产三级a| 日韩专区第一页| 欧美一级视频免费观看| 国产精品自拍亚洲| 麻豆网站在线看| 高清一级淫片a级中文字幕 | 国产高清在线精品一区a| 欧美激情一区二区三区视频高清| 亚洲 国产精品 日韩| 国产综合91天堂亚洲国产| 黄视频网站免费看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 超级乱淫黄漫画免费| 成人免费福利片在线观看| 国产极品白嫩美女在线观看看| 国产一区二区高清视频| 九九免费高清在线观看视频| 色综合久久久久综合体桃花网| 欧美日本国产| 日日爽天天| 国产视频一区二区在线观看| 99热热久久| 精品视频在线看 | 国产美女在线观看| 精品视频在线看| 黄色短视屏| 日韩一级精品视频在线观看| 亚飞与亚基在线观看| 国产视频一区二区在线播放| 一级片片| 免费一级片在线| 国产福利免费视频| 国产视频在线免费观看| 国产成人精品一区二区视频| 欧美国产日韩在线| 日韩av成人| 亚洲天堂一区二区三区四区| 亚洲 男人 天堂| 欧美一区二区三区在线观看| 日韩欧美一及在线播放| 四虎影视精品永久免费网站| 精品视频在线观看视频免费视频| 欧美一区二区三区在线观看| 成人免费观看视频| 99热热久久| 亚州视频一区二区| 成人在激情在线视频| 国产高清在线精品一区二区| 沈樵在线观看福利| 色综合久久天天综合观看| 成人在免费观看视频国产| 九九九在线视频| 香蕉视频久久| 在线观看成人网| 亚洲精品久久久中文字| 黄色免费三级| 四虎久久精品国产| 99热视热频这里只有精品| 日韩中文字幕在线观看视频| 国产极品白嫩美女在线观看看| 国产亚洲精品成人a在线| 久久精品店| 九九精品久久久久久久久| 日韩欧美一二三区| 台湾美女古装一级毛片| 九九九在线视频| 国产国语对白一级毛片| 99久久精品费精品国产一区二区| 青青青草视频在线观看| 精品视频在线观看视频免费视频| 国产成人啪精品视频免费软件| 国产一区二区精品尤物| 精品美女| 青草国产在线观看| 亚洲精品影院久久久久久| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 成人a级高清视频在线观看| 韩国三级香港三级日本三级| 日韩一级黄色| 国产一区二区精品| 91麻豆精品国产高清在线| 日本在线不卡视频| 日本伦理片网站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久精品大片| 成人a大片在线观看| 国产视频网站在线观看| 国产伦理精品| 一级片免费在线观看视频| 黄色短视屏| 成人高清免费| 成人高清免费| 黄色免费三级| 色综合久久久久综合体桃花网| 九九九国产| 久久99青青久久99久久| 国产不卡在线观看| 国产视频一区二区在线观看| 亚洲第一视频在线播放| 国产网站免费观看| 国产网站免费视频| 国产网站免费在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 免费国产在线观看| 国产伦理精品| 精品国产一区二区三区免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 香蕉视频久久| 欧美激情在线精品video| 欧美1卡一卡二卡三新区| 99色视频在线| 一级毛片视频在线观看| 国产网站免费观看| 成人免费观看男女羞羞视频| 欧美日本韩国| 精品视频在线观看一区二区| 精品久久久久久中文字幕一区| 日日日夜夜操| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 色综合久久手机在线| 日韩欧美一及在线播放| 精品久久久久久中文| a级精品九九九大片免费看| 国产网站免费视频| 深夜做爰性大片中文| 午夜在线观看视频免费 成人| 你懂的在线观看视频| 精品视频在线看| 一级女性大黄生活片免费| 色综合久久天天综合观看| 美国一区二区三区| 四虎影视久久久免费| 久草免费在线观看| 四虎影视库国产精品一区| 亚洲 激情| 麻豆系列 在线视频| 成人av在线播放| 日日日夜夜操| 欧美激情影院| 高清一级淫片a级中文字幕 | 国产国产人免费视频成69堂| 午夜欧美福利| 成人免费网站久久久| 日韩字幕在线| 精品国产三级a| 中文字幕97| 天天色成人网| 国产伦理精品| 国产精品免费久久| 精品久久久久久中文| 精品在线观看一区| 欧美日本韩国| 国产高清在线精品一区a| 精品视频在线观看视频免费视频 | 欧美国产日韩在线| 午夜激情视频在线观看| 久草免费在线视频| 日本伦理网站| 天天做人人爱夜夜爽2020毛片| 国产网站麻豆精品视频| 日韩在线观看免费完整版视频| 欧美一级视| 久草免费在线观看| 四虎影视久久久| 久久99这里只有精品国产| 九九免费高清在线观看视频| a级毛片免费全部播放| 国产视频一区二区在线观看| 一本伊大人香蕉高清在线观看| 午夜久久网| 国产视频网站在线观看| 精品视频在线观看一区二区三区| 成人高清免费| 精品视频在线看 | 国产不卡在线观看| 国产伦理精品| 午夜在线观看视频免费 成人| 天天做人人爱夜夜爽2020毛片| 日韩免费在线视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 99久久网站| 精品在线观看一区| 你懂的在线观看视频| 九九精品久久久久久久久| 四虎影视久久久免费| 色综合久久天天综合| 成人a级高清视频在线观看| 国产极品白嫩美女在线观看看| 91麻豆精品国产自产在线观看一区 | 国产不卡高清在线观看视频| 天天做人人爱夜夜爽2020| 国产一区免费在线观看| 精品久久久久久中文字幕2017| 亚洲天堂在线播放| 亚洲天堂免费| 一级毛片视频免费| 成人av在线播放| 国产欧美精品| 黄色福利片|