微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-通过MongoDB游标迭代很慢

我需要遍历约200万个文档的完整MongoDb集合.因此,我正在使用游标功能和eachAsync函数.但是我注意到它非常慢(需要40多分钟).我尝试了多达5000个不同的batchSizes(针对MongoDB的查询仅为400个).

该应用程序不会占用太多cpu(0.2%-1%),也不会占用大量RAM或IOP.因此,显然可以优化我的代码以加快此过程.

编码:

  const playerProfileCursor = PlayerProfile.find({}, { tag: 1 }).cursor({ batchSize: 5000 })
  const p2 = new Promise<Array<string>>((resolve, reject) => {
    const playerTags:Array<string> = []
    playerProfileCursor.eachAsync((playerProfile) => {
      playerTags.push(playerProfile.tag)
    }).then(() => {
      resolve(playerTags)
    }).catch((err) => {
      reject(err)
    })
  })

当我在eachAsync函数体内设置断点时,它将立即命中.因此,没有任何卡住,它是如此之慢.有没有办法加快速度?

解决方法:

功能是在4.12版(最新的atm)中添加的,尚未真正记录.

认情况下,eachAsync的并发性为1,但您可以在参数“ parallel”中对其进行更改. (as seen here)

因此,您的代码可能如下所示:

const playerProfileCursor = PlayerProfile.find({}, { tag: 1 }).cursor({ batchSize: 5000 })
const p2 = new Promise<Array<string>>((resolve, reject) => {
const playerTags:Array<string> = []
playerProfileCursor.eachAsync((playerProfile) => {
  playerTags.push(playerProfile.tag)
}, { parallel: 50 }).then(() => {
  resolve(playerTags)
}).catch((err) => {
  reject(err)
})
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐