我正在尝试将这个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玩家,为这个项目。
答案 0 :(得分: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.
}
}
});
然后不是销毁每个zet
,而是在db上执行删除查询。
Player.destroy({
where: {
name : {
$like : '%zzzzz%'
}
}
});