欧博在线入口 首页 欧博注册网址 欧博平台 欧博手机app 欧博正网注册 欧博博彩网址 欧博app下载 欧博百家乐app 欧博线上代理 欧博体育网站

你的位置: 欧博在线入口 > 欧博app下载 >

彩票彩票网博彩平台注册送免费赌场_MongoDB 系列 - 数据查询游标你用对了吗?

发布日期:2023-10-30 06:21    点击次数:135

彩票彩票网博彩平台注册送免费赌场_MongoDB 系列 - 数据查询游标你用对了吗?

彩票彩票网博彩平台注册送免费赌场_

本文转载自微信公众号「编程界」,作家五月君 澳门金沙电子游戏 。转载本文请相关编程界公众号。

博彩平台注册送免费赌场 几个话题

本文会字据以下几个话题进行盘问与训导,文中的目次不十足和这几个话题一致,但当你阅读完本文后,确信这些谜底应该也有了,王人在文中。

为什么要使用游标、什么技艺使用? 关切工作器内存,游标什么技艺关闭? 需要着重的游标超时与容错处理 为什么不要稳定调遣 batchSize 数目? 使用时需着重 Mongoose 与原生 Node.js MongoDB 驱动面容的不同之处 解答群友问题时发现的一个对于游想法 Bug 彭胀 - 为什么不错使用 for await of 遍历游标对象? 为什么要使用游标?

这么的写法 collection.find().toArray(),世界在学习 MongoDB 时应该见的也不少,它的旨趣是客户端驱动面容会自动把复返的所罕有据一次性加载到哄骗面容内存中,斡旋起来相对浅显些,要是数据量小是没问题的,在一些数据处理的场景中,具体有几许数据也许是未知的,有可能复返大量的数据,要是一谈 hold 在内存,在工作端内存寸土寸金的场所,白白蹂躏工作内存不说,内存占用过高还可能酿成工作 OOM。

莱斯特城足球俱乐部最近,皇冠博彩平台邀请多位知名体育明星代言,包括詹姆斯、梅西,平台注入新活力激情。提供博彩攻略技巧分享,您博彩游戏中尽情享受乐趣收益。平台安全稳定,操作简便,充值提款方便快捷,您最佳博彩选择。

MongoDB 内部的游标,有点雷同于在 Node.js 里使用 Stream 处理文献数据,比拟把通盘文献读入内存在处理这种形态,Stream 带来的收益是很大的。

太平洋百家乐

很形象的一个图,起首:https://www.cnblogs.com/vajoy/p/6349817.html[1]

游标基本使命旨趣

当咱们使用 collection.find() 或 collection.aggregate() 复返的是一个指向该聚合的指针,也称为游标(cursor),是不可径直看望数据的,唯一当轮回迭代这个游标时才会简直的从数据库聚合读取数据。

在 Node.js 中使用很浅显,只须复旧 for await of 语法,即可遍历游标复返的数据集,和平方使用 for of 遍历数组很相似,分裂是 for await of 遍历的数据源是异步的。当轮回迭代运行时驱动面容会使用 getMore() 号令批量从数据库聚合中获得一批数据先缓存起来,举例 Node.js MongoDB 驱动面容每次默许批量获得 1000 条(着重,第一次 getMore() 时本色苦求是 101 条),取决于 batchSize[2] 参数开发,待这批数据处理完成之后,在向 MongoDB Server 实施 getMore() 继续苦求直到游标耗尽。

皇冠hg86a

以下为 Node.js 中的两种使用示例,个东谈主比较推选 for await of 这种写法。方法二 while 轮回这种写法在一个 MongoDB Node.js 驱动面容版块中存在一个 Bug 下文会先容。

const userCursor = await collection.find();  // 要是莫得复返数据,需要作念一些荒谬处理的,不错使用 userCursor.count() 或 userCursor.hasNext() if (!await userCursor.count()) {   // TODO: 提前落幕,作念一些其它操作   return; }  // 方法一: for await (const user of userCursor) { }  // 方法二: while (await userCursor.hasNext()) {  const doc = userCursor.next(); } 

举例,数据库聚合有 10000 条数据,每次批量获得 1000 条,I/O 蹂躏应该也为 10 次。末端邻接至 MongoDB Server 开发 db.setProfilingLevel(0, { slowms: 0 })纪录整个的操作日记,之后在掀开 MongoDB Server 胁制台日记,实施哄骗面容之后会看到如下日记信息,每次 getMore 王人指向了统一个游标 ID getMore: 5098682199385946244。

数据分析

游标读取后果.png

要是需要修改 batchSize 后果的,通过 options 指定 batchSize 属性或调用 batchSize 方法王人不错。

collection.find().batchSize(1100) // 或以下方法 collection.find({}, {   batchSize: 1100 }) 

切记不要将 batchSize 开发为 1,举例,10000 条数据每获得一条数据,客户端王人将伙同工作器读取,这将会产生 10000 次网罗 IO,下图使用 mongostat 监控,展示了每秒查询游标时的 getMore 次数。

游标超时

要是一个游标在一定时辰内无东谈主看望,超时之后会被回收,详确产生内存泄漏,启动时可通过 mongod --setParameter cursorTimeoutMillis=300000 参数开发,默许超时为 10 分钟,参见文档 cursorTimeoutMillis#Default: 600000 (10 minutes)[3]。

举例,悉数查询 10000 条数据,第一次 getmore() 默许批量获得 1000 条数据,要是在默许的 10 分钟内莫得处理完成这 1000 条数据,游标会被关闭,待下次实施 getmore() 就会报错 cursor id 4011961159809892672 not found,一般称之为游标超时。

皇冠客服飞机:@seo3687

如有遭受游标超时,可通过调遣 cursorTimeoutMillis 参数或减少 batchSize 数目接受稳当于我方的面容竖立,常常默许竖立是不需要调遣的。举例,在遍历游标数据时调了一个外部接口,由于接口超时导致的游标超时这种外部业务原因的,应先去优化业务自身,再研讨调遣竖立。

彩票彩票网

为了处理游标超时,你可能还见到过 cursor.addCursorFlag('noCursorTimeout', true) 这么的竖立,这会禁用掉游想法超时持法,唯一比及游标耗尽或手动关闭 cursor.close() 游标才可能被开释,欧博线上代理禁用超时常辰这种作念法,很不推选使用,每个游标王人存在独特的内存占用蹂躏,要是因为强劲健忘手动关闭游标导致的 MongoDB Server 内存泄漏就塞翁失马了。

游标现象

登陆 MongoDB 客户端,实施 db.serverStatus().metrics.cursor 号令,稽查现时游标使用现象。要是确实出现游标导致的 MongoDB 工作器内存泄漏,以下几个数据规画,作念为运维东谈主员在排查问题时,会有匡助。

bet365365官网 timedOut:指 MongoDB Server 进度启动到咫尺整个的游标超时数目,此规画响应了哄骗面容因为处理耗时任务 或 游标掀开后因为报错莫得浮现关闭游标 这两种情况导致的游标超时数目。 open.noTimeout:为了详确游标超时,MongoDB 提供了一个竖立 DBQuery.Option.noTimeout[4] 开发永不超时,但要是处理完了健忘浮现关闭游标,会导致游标常驻内存,数目越大内存泄漏的风险也越大,提议是尽量不要开发 noTimeout。 open.pinned:“固定” 掀开游想法数目。 open.total:MongoDB Server 现时为客户端掀开的游标数目,当有游标耗尽,total 的数目也会不断的减少。
{  "timedOut" : NumberLong(4),  "open" : {   "noTimeout" : NumberLong(0),   "pinned" : NumberLong(0),   "total" : NumberLong(0)  } } 
游标与异步迭代器

JavaScript 在 ES6 语法提供了一个功能叫迭代器,界说了一套统一的接口,只须完结了该接口的数据类型,王人可使用 for of 要害词遍历,举例数组、Map、Set 类型等,这些类型上有一个方法 Symbol.iterator 复返的便是一个迭代器对象,迭代器对象的 next() 方法复返值包含了 vlaue、done 两个属性,要是 done 为 true 示意数据已遍历完成,但 Symbol.iterator 只复旧同步的数据源。

而咱们从数据库聚合获得数据波及到网罗 I/O,这是一个异步的操作,Symbol.iterator 就无法复旧了,在ECMAScript 2018 法子中提供了一个新的属性 Symbol.asyncIterator,这是一个异步迭代器,与 Symbol.iterator 不同的是 Symbol.asyncIterator 的 next() 方法复返的是一个包含 { value, done } 的 Promise 对象,要是一个对象开发了该属性,它便是异步可迭代对象,相应的咱们可使用 for await...of 轮回遍历数据。

底下看下 MonogoDB Node.js 驱动面容在 v4.2.2 版块中的完结,相通也提供了 Symbol.asyncIterator 接口,这也便是为什么咱们不错使用 for await...of 轮回遍历。

// mongodb/lib/cursor/abstract_cursor.js class AbstractCursor extends mongo_types_1.TypedEventEmitter {   [Symbol.asyncIterator]( "Symbol.asyncIterator") {     return {       next: () => this.next().then(value => value != null ? { value, done: false }: { value: undefined, done: true })     };   } } 
容错处理

在遍历游想法进程中,for 轮回体内要是出现一些无理导致轮回提前隔断,这个技艺游标并不会被坐窝葬送,不错接受手动关闭游标或恭候高出默许的游标超时常辰后,游标也会被葬送。

要是开发了 noCursorTimeout 属性为永不超时,这个技艺就一定铭刻要关闭游标,因此在上头也提议尽量不要作念这个开发。

const userCursor = await collection.find(); try {   for await (const user of userCursor) {     // 可能抛出无理 throw new Error('124')   } } catch (e) {   // 处理无理 } finally {  userCursor.close();   } 
Mongoose 需要着重的场所

使用 mongoose 和原生复旧的 mongodb 模块也曾有许多互异的,mongoose 的 find() 方法默许不会复返游标对象,需要在 find 后浮现调用 cursor() 方法,且莫得 cursor.count()、cursor.hasNext() 方法复旧,对于一些想判断要是游标没罕有据作念一些荒谬处理,处理起来不是很友好。

const userCursor = await User.find({}).cursor();  for await (const user of userCursor) { } 
一个对于游想法 Bug

在 Node.js 群里,一个群友发来音书使用游标遭受了问题,其后也对这个问题作念了一些查找和考据,下文会先容,基于一个特定版块和特定的哄骗场景才会出现这个问题,放在这里亦然但愿用到的一又友能少踩一个坑。

MongoDB Node.js 驱动面容在 3.5.4 版块基于游标迭代查询数据时,要是用了 limit 持法复返的数据条件,况兼使用 hasNext(),存在一个 Bug,最初是从复返的游标对象取出的 count 数不合,其次是遍历出的数据条件与本色 limit count 数对不上,要是 limit 为奇数还会收到 MongoError: Cursor is closed 无理。

要是需要调遣每一次的 getMore() 数目,游标不错连合 batchSize 使用。为什么用了游标还要使用 limit?这个也不错念念考下。

const userCursor = await collection.find({}).limit(5); console.log('cursor count: ', await userCursor.count()); try {   while (await userCursor.hasNext()) {     const doc = await userCursor.next();     console.log(doc);   } } catch (err) {   console.error(err.stack); } userCursor.close(); 

mongodb@^3.5.4 版块输出后果:

cursor count:  10000 { _id: 61d6590b92058ddefbac6a14, userID: 0 } { _id: 61d6590b92058ddefbac6a15, userID: 1 } null MongoError: Cursor is closed     at Function.create (/test/node_modules/mongodb/lib/core/error.js:43:12)     at Cursor.hasNext (/test/node_modules/mongodb/lib/cursor.js:197:24)     at file:///test/index.mjs:42:27     at processTicksAndRejections (internal/process/task_queues.js:93:5) 

NPM 包 mongodb 受影响版块为 3.5.4 参见 issue jira.mongodb.org/browse/NODE-2483[5]NPM 包 mongoose 受影响版块为 5.9.4 参见 issue github.com/Automattic/mongoose/issues/8664[6]

参考贵寓

[1]https://www.cnblogs.com/vajoy/p/6349817.html: https://www.cnblogs.com/vajoy/p/6349817.html

[2]batchSize: https://docs.mongodb.com/manual/tutorial/iterate-a-cursor/#cursor-batches

[3]cursorTimeoutMillis#Default: 600000 (10 minutes): https://docs.mongodb.com/manual/reference/parameters/#mongodb-parameter-param.cursorTimeoutMillis

据今日俄罗斯网站报道,德国《商报》指出,在乌克兰军队服役的西方主战坦克,所使用的柴油其实是由俄罗斯原油提炼而来的,而基辅的购买渠道其实是匈牙利,土耳其等这些还能从俄罗斯低价购买原油的国家。尽管匈牙利是欧盟成员国,但是他们已经获得了继续通过管道从俄罗斯进口石油的豁免权。而土耳其则一直都是俄罗斯能源的忠实买家。

说到核磁共振仪,想必大家都不陌生,但就是这个被称为人体“照妖镜”的机器,一直以来却都依赖于进口。与普通的CT机相比,核磁共振仪没有电离辐射的危害,孕妇和儿童也适用。此外,核磁共振仪对软组织的分辨率高,检查结果也更准确。

[4]DBQuery.Option.noTimeout: https://docs.mongodb.com/manual/reference/method/cursor.addOption/#mongodb-data-DBQuery.Option.noTimeout

火博体育手机app下载地址

[5]NPM 包 mongodb 受影响版块为 3.5.4 参见 issue jira.mongodb.org/browse/NODE-2483: https://jira.mongodb.org/browse/NODE-2483

[6]NPM 包 mongoose 受影响版块为 5.9.4 参见 issue github.com/Automattic/mongoose/issues/8664: https://github.com/Automattic/mongoose/issues/8664

 

 



----------------------------------
栏目分类
相关资讯