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 名玩家参与这个项目。
在结果包含大量行的查询中,所有行都将在回调之前加载到内存中。
因此,在此示例中,查询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)
| 归档时间: |
|
| 查看次数: |
3320 次 |
| 最近记录: |