Mongoose 游标eachAsync 会造成内存泄漏

问题描述 投票:0回答:1

我想使用 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.js mongoose memory-leaks nestjs amazon-sqs
1个回答
0
投票

要找出可能导致内存泄漏的原因,您需要通过使用

node --inspect
启动应用程序并结合浏览器的 DevTools
chrome://inspect
来分析和监控内存,访问此网址时将有一个
Devices
您可以配置要监视的地址,例如
127.0.0.1:3000
,单击
inspect
按钮,打开
Menory
部分,通过它您可以了解实际导致内存泄漏的原因。

我遇到的内存泄漏问题之一是当我开发文件上传系统时,使用

inspect
我发现问题之一是当滚动数组时,与猫鼬的连接被打开。对于我在数据库中更新的每个项目,对我来说有必要关闭连接。

也许

node --inspect
可以帮助你,对于我来说,查看 Node.js 文档,这确实帮助我解决了应用程序中的内存泄漏问题。

© www.soinside.com 2019 - 2024. All rights reserved.