我想使用 Mongoosecursor.eachAsync 迭代 1000 个文档,批处理大小为 10。有时它会造成内存泄漏。每次数据迭代都将发送到 AWS SQS 队列以进行进一步处理。
let campaignUserCursor = await this.campaignUserModel
.aggregate([...query])
.allowDiskUse(true)
.cursor({ batchSize: 10 })
.exec();
campaignUserCursor.eachAsync(async (campaignUser) => {
const queueObj = this.setObj(campaignUser);
await this.sqsProducerService.sendMessage(queueObj);
await this.broadcastRepository.updateBroadcast(queueObj, {
$inc: { total_queue_count: 1 }});
},
{ parallel: 10 },() => {});
如果 doc size 数量较多,偶尔会发生内存泄漏。有什么方法可以处理 Mongoose 迭代而不会造成内存泄漏吗?
另外,我们如何使用@ssut/nestjs-sqs模块向SQS发送批量消息?主要目标是将这些 Mongoose 文档发送到队列以进行进一步处理。
要找出可能导致内存泄漏的原因,您需要通过使用
node --inspect
启动应用程序并结合浏览器的 DevTools chrome://inspect
来分析和监控内存,访问此网址时将有一个 Devices
您可以配置要监视的地址,例如 127.0.0.1:3000
,单击 inspect
按钮,打开 Menory
部分,通过它您可以了解实际导致内存泄漏的原因。
我遇到的内存泄漏问题之一是当我开发文件上传系统时,使用
inspect
我发现问题之一是当滚动数组时,与猫鼬的连接被打开。对于我在数据库中更新的每个项目,对我来说有必要关闭连接。
也许
node --inspect
可以帮助你,对于我来说,查看 Node.js 文档,这确实帮助我解决了应用程序中的内存泄漏问题。