gpt4 book ai didi

javascript - 遍历 MongoDB 游标很慢

转载 作者:可可西里 更新时间:2023-11-01 09:25:45 26 4
gpt4 key购买 nike

我需要迭代包含约 200 万个文档的完整 MongoDb 集合。因此,我正在使用游标功能和 eachAsync 函数。但是我注意到它非常慢(需要 40 多分钟)。我尝试了不同的 batchSizes,最大为 5000(这对 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)
})
})

关于javascript - 遍历 MongoDB 游标很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46671321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com