内存泄漏,使用Sequelize ORM for NodeJS

时间:2015-10-29 11:45:47

标签: node.js memory-leaks orm 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);
    });
});

P.S。它没有意义,只是看看ORM是如何工作的。如果这很重要,我有1k玩家,为这个项目。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

然后不是销毁每个zet,而是在db上执行删除查询。

Player.destroy({
  where: {
    name : {
      $like : '%zzzzz%'
    }
  }
});