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

首頁 > 數(shù)據(jù)庫 > MongoDB > 正文

MongoDB游標(biāo)超時(shí)的情況怎樣解決?

2024-09-07 00:22:29
字體:
供稿:網(wǎng)友
      本文主要給大家分享關(guān)于MongoDB游標(biāo)超時(shí)問題的解決辦法,小編認(rèn)為是比較實(shí)用的,有這方面學(xué)習(xí)需要的朋友可以看看,希望大家閱讀完這篇文章之后大有收獲。
 
       當(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)單,能有什么問題?只要parse_data(row)不報(bào)錯(cuò),這一段代碼就完美無缺。但事實(shí)并非這樣。
 
       你的代碼可能會(huì)在for row in handler.find()這一行報(bào)錯(cuò)。它的原因,說來話長(zhǎng)。要解釋這個(gè)問題,我們首先就需要知道,handler.find()返回的并不是數(shù)據(jù)庫里面的數(shù)據(jù),而是一個(gè)游標(biāo)(cursor)對(duì)象。
 
       只有當(dāng)你使用for循環(huán)開始迭代它的時(shí)候,游標(biāo)才會(huì)真正去數(shù)據(jù)庫里面讀取數(shù)據(jù)。但是,如果每一次循環(huán)都連接數(shù)據(jù)庫,那么網(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ù)庫。
       當(dāng)循環(huán)進(jìn)行到底101次的時(shí)候,再一次連接數(shù)據(jù)庫,再讀取第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
 
       所以,回到最開始的代碼中來,如果parse_data每次執(zhí)行的時(shí)間超過6秒鐘,那么它執(zhí)行100次的時(shí)間就會(huì)超過10分鐘。此時(shí),當(dāng)程序想讀取第101行數(shù)據(jù)的時(shí)候,程序就會(huì)報(bào)錯(cuò)。
       為了解決這個(gè)問題,我們有4種辦法:
 
修改MongoDB的配置,延長(zhǎng)游標(biāo)超時(shí)時(shí)間,并重啟MongoDB。由于生產(chǎn)環(huán)境的MongoDB不能隨便重啟,所以這個(gè)方案雖然有用,但是排除。
一次性把數(shù)據(jù)全部讀取下來,再做處理:
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ù)庫,只返回50行數(shù)據(jù)
for row in handler.find().batch_size(50):
 parse_data(row)
       但這種方案會(huì)增加數(shù)據(jù)庫的連接次數(shù),從而增加I/O耗時(shí)。
 
  4.讓游標(biāo)永不超時(shí)。通過設(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)就再也無法關(guān)閉了!除非重啟MongoDB,否則這些游標(biāo)會(huì)一直留在MongoDB上,占用資源。
       當(dāng)然可能有人會(huì)說,使用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里面的代碼,無論有沒有異常,都會(huì)執(zhí)行。但這樣寫會(huì)讓代碼非常難看。為了解決這個(gè)問題,我們可以使用游標(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)閉。它的原理可以用下面兩段代碼來解釋:
 
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)行效果如下圖所示:
 
 
 
       接下來在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)')
 
 
       無論在with的縮進(jìn)里面發(fā)生了什么,Test這個(gè)類中的__exit__里面的代碼始終都會(huì)運(yùn)行。我們來看看pymongo的游標(biāo)對(duì)象里面,__exit__是怎么寫的,如下圖所示:
 
       可以看到,這里正是關(guān)閉游標(biāo)的操作。因此,如果我們使用上下文管理器,就可以放心大膽地使用no_cursor_timeout=True參數(shù)了。

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
东凛在线观看| 欧美精品一区二区高清在线观看| 超碰免费公开在线| 亚洲av无码国产精品永久一区| 国产免费人人看| 99精品久久久久久| 波多野结衣高清视频| 女女色综合影院| 99精品视频免费观看| 国产精品福利在线播放| 动漫美女被爆操久久久| 日本a级片久久久| 九九热免费在线观看| 国产精品第9页| 麻豆视频国产| 国产精品久久久久久一区二区| 最新欧美色图| 日韩一区二区a片免费观看| 小草av在线播放| 不卡福利视频| 久热中文在线| 国产清纯在线一区二区www| 《视频一区视频二区| 九色蝌蚪国产| 亚洲精品国产视频| 日韩欧美另类中文字幕| 一区二区www| 一级黄色大片儿| 欧美性生交大片免网| 国产精品1区二区.| 久久这里都是精品| 国风产精品一区二区| 日本亚洲欧美天堂免费| 日韩av电影免费播放| 日韩精品乱码av一区二区| 中文一区一区三区高中清不卡| 污污视频在线| 亚洲精品视频免费观看| 久久久久久久久久久久久久久| 日韩一区二区三区av| 国产一级片中文字幕| 中文字幕在线网| 亚洲电影免费观看高清| 无码国产精品一区二区高潮| 日日夜夜天天综合入口| 色综合中文综合网| 欧美日韩亚洲系列| 在线电影国产精品| 日韩在线视频网站| 91久久在线视频| 免费av高清| 添女人荫蒂视频| 亚洲一区二区三区小说| 亚洲欧美一区二区三区国产精品| 黄色大片a级| 91caopron| 亚洲国产毛片aaaaa无费看| eeuss影影院www在线播放| 日本精品一区二区三区在线播放视频| 亚洲成人动漫在线观看| 性金发美女69hd大尺寸| 欧美黑白配在线| 国产女主播在线直播| 亚洲色图一二三区| 日本www高清视频| 蜜臀在线免费观看| 亚洲精品ww久久久久久p站| 久久免费电影网| 国产精品国产三级国产传播| 国产欧美日韩另类视频免费观看| 香蕉视频黄色在线观看| 色婷婷亚洲一区二区三区| 日韩亚洲欧美视频| 亚洲一区不卡在线| 精品人妻一区二区三| 亚洲在线视频免费观看| 日韩一级片大全| 宅男午夜电影| 亚洲欧美在线不卡| 91精品国产色综合久久ai换脸| 国产国产精品人在线视| 黄色一级片视频| 久久久久久91亚洲精品中文字幕| 久久久免费人体| 性感美女一区二区三区| 国产精品原创巨作av| 手机av在线播放| 久久精品美女视频网站| 国产一二区在线观看| 视频一区二区视频| 欧美三级日本三级| 国产原创在线视频| 欧美性久久久久| aⅴ在线免费观看| 国产精品一区二区av白丝下载| 成年女人的天堂在线| 国产视频每日更新| 少妇高潮 亚洲精品| www国产一区| 欧美jizzhd欧美| 久久国产精品久久久久久久久久| 亚洲狼人精品一区二区三区| 在线观看岛国av| 殴美一级黄色片| 国产福利拍拍拍| 国产亚洲欧洲高清一区| 国内av免费| 俄罗斯嫩小性bbwbbw| 一区 二区 三区| 欧美大奶一区二区| 欧美破处大片在线视频| 影音先锋男人的网站| 日韩一级大片| 香蕉视频色版| 少妇精品视频一区二区| 欧美日韩一区二区在线播放| 亚洲在线视频免费| 九色porny丨首页在线| 午夜精品福利在线| 国产精品毛片久久久久久久| 国产视频一二| 欧美日韩福利| 亚洲第一中文字幕| 日本少妇xxxx软件| 日韩新的三级电影| av在线资源网| 激情自拍一区| av一区二区三区在线观看| 午夜精品在线免费观看| 午夜在线观看视频18| 蜜桃av免费看| 丝袜美腿诱惑一区二区三区| 国产精品久久久久久久久久久免费看| 国产精品一区二区在线免费观看| 国产精品乱子久久久久| 成人午夜精品一区二区三区| 中文字幕在线永久在线视频2020| 免费看的黄网站| 亚洲乱码精品一二三四区日韩在线| 在线观看av网站永久| 国内自拍亚洲| 久久久久亚洲av成人网人人软件| 免费看岛国视频在线观看| 成人v精品蜜桃久久一区| 成人一区二区三| 国产美女撒尿一区二区| 免费精品国产的网站免费观看| 成人有码视频在线播放| 波多野结衣精品| 精品一区二区日韩| www.1024| 日韩欧美在线观看| 国产色在线播放| 伊人精品一区| 亚洲国产精品一区二区第四页av| 欧美一区二区美女| 无码国产精品一区二区免费式直播| 极品av少妇一区二区| 国产在线精品一区在线观看麻豆| 精品av综合导航| 国内精品国语自产拍在线观看| 天天干天天爽天天射| 91精品国产91热久久久做人人| 亚洲成人免费| 国产亚洲精品熟女国产成人| 日韩欧美国产系列| 亚洲国产精品久久久久久女王| 亚洲精品国产av| 国产日韩1区| 久久sese| 懂色av中文字幕一区二区三区| 高清国语自产拍免费一区二区三区| 无码人妻h动漫| 国产一级二级三级精品| 中文字幕人妻熟女人妻洋洋| 欧美激情另类| 香蕉视频网站在线播放| 国产真实生活伦对白| 99视频免费在线观看| 亚洲va欧美va天堂v国产综合| 欧美午夜片欧美片在线观看| 国产夫妻在线观看| 欧美成人性生活视频| 日本羞羞视频| 88xx成人网| 中文字幕一区日韩电影| 日韩无套无码精品| 欧美 日韩 国产 精品| 日韩精品一区二区三区蜜臀| 色综合久久久久久久久| 亚洲第一区中文99精品| 国产欧美一区二区三区沐欲| 日本不卡一区二区在线观看| 国产精品久久久久久久久久白浆| 116极品美女午夜一级| 欧美少妇在线观看| 另类激情亚洲| 中文字幕免费一区二区三区| 日本道色综合久久影院| 亚洲美女视频一区| 日韩在线视频免费观看| 中出视频在线观看| 日韩三区在线观看| 性欧美长视频免费观看不卡| 日本精品一区二区三区四区的功能| 亚洲成人一二三区| 日韩性xxxx爱| 国产精品理人伦一区二区三区| 亚洲日本一区二区| 成人在线免费观看av| 国产成人小视频| 顶级欧美妇高清xxxxx| 亚洲欧洲av另类| 日本福利片高清在线观看| 国产精品一卡| 国产精品污www一区二区三区| 在线视频观看一区| 在线观看国产一区| 一区二区国产欧美| 亚洲天堂免费av| 日韩在线免费av| 黄色网址免费看| 超碰电影在线播放| 日韩一区二区欧美| 国产成人精品亚洲精品色欲| 中文乱码字幕高清在线观看| 最近2019年好看中文字幕视频| 加勒比在线一区二区三区观看| 免费一级肉体全黄毛片| 免费人成又黄又爽又色| 欧美有码在线视频| 久久国产精品影院| 久草福利在线| 日本女人黄色片| 久久成人在线观看| 亚洲综合色丁香婷婷六月图片| 亚洲日韩欧美一区二区在线| 亚洲精品免费电影| 成人在线免费公开观看视频| 国产又黄又猛又粗又爽| 欧洲综合视频| 在线一区亚洲| 日韩视频不卡| 精品视频网站| 九九热精品视频| 四季av一区二区三区| 久久精品国产亚洲av高清色欲| 午夜影院久久久| 国产精品乱人伦| 国产日韩一区欧美| 亚洲精品乱码久久久久久动漫| 国产啪精品视频| 国产原创在线播放| 神马影院我不卡| 成人免费毛片网| 蜜桃视频在线观看视频| 久久视频精品在线观看| 91.麻豆视频| 中文国产亚洲喷潮| 欧美激情亚洲国产| 精品人妻少妇一区二区| 亚洲无线视频| 国产精品午夜一区二区欲梦| heyzo高清在线| 国语一区二区三区| 成人在线小视频| 欧美黑人巨大xxxx猛交| 久久久久99精品成人片试看| 久久久爽爽爽美女图片| 91精品国产自产精品男人的天堂| 男人午夜视频| 中文视频一区| 成人综合婷婷国产精品久久| 天堂аⅴ在线最新版在线| 性生活视频网站| 日本丰满少妇裸体自慰| 国产伦精品一区二区三区四区视频| 国产成人无码精品久久久性色| 免费看a级黄色片| 国产精品久久久久不卡| 不卡视频一二三| 亚洲欧美一二三区| 性欧美xxx极品另类| 欧美成人精品一区二区男人小说| 亚洲美女视频在线免费观看| 国产精品原创视频| 亚洲精品国产欧美| 日本视频在线播放| 亚洲春色综合另类校园电影| 欧洲人成人精品| 欧美亚洲日本在线观看| 日本高清精品| 精品电影一区二区| 视频一区二区三区在线看免费看| 雨宫琴音一区二区在线| 亚洲综合色视频在线观看| 国产精品美女| 宅男在线一区| 国产精品va| 日本成片免费高清| 45www国产精品网站| 久久久久久久久久久视频| 国产精品久久久久久久久免费樱桃| 亚洲精品日韩专区silk| 中文乱码免费一区二区三区下载| 日本a级片在线播放| 国产又粗又猛又爽又黄的视频四季| 我要色综合中文字幕| 亚洲免费高清| 欧美精品电影在线| 亚洲精品美女视频| 国产精品人人妻人人爽| 黄页网站在线免费观看| 亚洲综合在线中文字幕| 国产精品成人国产乱| 国产精品毛片一区二区三区四区| 久久发布国产伦子伦精品| 欧美精品videosex性欧美| 91专区视频| caoporn国产精品免费公开| 一本色道久久88综合亚洲精品ⅰ| 99热这里只有精品7| 1024在线播放| 99久久99久久精品免费看小说.| 日韩视频一区| 免费av一区二区三区四区| 中文字幕日韩免费| 51精品国产人成在线观看|