内存泄漏,使用 Sequelize ORM for NodeJS

Jew*_*ash 5 orm memory-leaks node.js sequelize.js pm2

我正在尝试在我的项目中使用 Sequelize ORM 的东西。我已将其集成为示例https://github.com/sequelize/express-example。所以,很酷 - 目前它正在与所有关系和其他商品合作。问题是,pm2 显示我的内存使用量增加并且再也没有回来。

这是我的测试脚本,每次启动会占用 100 Mb 的 RAM。我错过了什么吗?

router.get('/test', hutils.authChecker, function(req, res, next) {
    Project.findById(1,{ include : [Player]}).then(function(project) {
        return Promise.denodeify(async.map)(project.Players, function(player, callback) {
            Player.create({
                project_id : 1,
                name       : 'iter_'+Math.floor(Math.random() * 1000000)+Math.floor(Math.random() * 1000000)
            }).then(function(gamer) {
                callback(null, gamer)
            });
        });
    }).then(function(plrs) {
        return Promise.denodeify(async.map)(plrs, function(guy, callback) {
            guy.update({name : sqlRequest+'zzzzz'+Math.random()}).then(function(number) {
                callback(null, number);
            });
        });
    }).then(function(numbers) {
        return Player.findAll({where : {name : {$like : '%zzzzz%'}}});
    }).then(function(zets) {
        return Promise.denodeify(async.map)(zets, function(zet, callback) {
            zet.destroy().then(function(number) {
                callback(null, number);
            });
        });
    }).catch(function(err) {
        next(err);
    });
});
Run Code Online (Sandbox Code Playgroud)

PS 这没有任何意义,只是看看 ORM 是如何工作的。如果有必要的话,我有 1000 名玩家参与这个项目。

Eva*_*oky 0

在结果包含大量行的查询中,所有行都将在回调之前加载到内存中。

因此,在此示例中,查询Project.findById(1,{ include : [Player]})将项目 1 及其所有 1,000 个玩家反序列化为 JavaScript 对象,然后将它们返回到.then(function(project). plrs此外, 、和numbers的数组zets在返回之前都类似地存储在内存中,从而增加了内存使用量。

解决这个问题的一种方法是让数据库来完成繁重的工作。例如,不要返回每个gamer创建的内容,而是对数据库执行更新查询。

Player.update({
  name : sqlRequest + 'zzzzz' + Math.random(),
}, {
  where: {
    createdAt: {
      $gte: new Date() // or some other filter condition that identifies the records you need.
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

然后不要销毁每个zet,而是对数据库执行删除查询。

Player.destroy({
  where: {
    name : {
      $like : '%zzzzz%'
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的关注,但就像我说的:“只是看看 ORM 是如何工作的,这是没有意义的。” 我不会在产品服务器上进行疯狂的查询:)。主要问题是,为什么我的内存使用量不断增加并且再也没有回来。Player.find({where : {project_id : 1}}); - 如果我做类似的事情,嗯.. 连续 1000 次,甚至没有保存结果 - 它仍然需要大量内存,并且之后不要清理它!:( (2认同)