【问题标题】:Memory leak, using Sequelize ORM for NodeJS内存泄漏,使用 Sequelize ORM for NodeJS
【发布时间】:2016-01-29 13:00:37
【问题描述】:

我正在尝试将这个 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);
    });
});

附:没有意义,只是看看ORM是如何工作的。如果有关系,我有 1k 名玩家,用于这个项目。

【问题讨论】:

    标签: node.js memory-leaks orm sequelize.js pm2


    【解决方案1】:

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

    因此,在此示例中,查询 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,而是对数据库执行删除查询。

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

    【讨论】:

    • 感谢您的关注,但就像我说的:`Its make no sense, just to look how the ORM works.。我不会做那个疯狂的查询s on prod server :). The main question is, why my memory usage grows and never coming back. Player.find({where : {project_id : 1}}); - if i do something like that, ammm.. 1000 times in row, without even saving the result - its 仍然占用大量内存,之后不要清理它! :(
    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多