我正在'heroku运行控制台‘上运行15k个用户的代码,它超过512 of,如何优化该代码以停止内存不足?
User.all.each do |user|
user.authorization = 'enabled'
user.save!
end为了简单起见,对这段代码进行了修改,在查询其他对象和user.authorization =“启用”时,我做了一些事情……我更想知道如何阻止内存泄漏?
发布于 2013-08-13 23:39:47
User.all返回一个延迟加载的activerecord关系*,对该关系调用#each将导致将该关系加载到实例化对象的集合中,这将根据数据库中的用户数消耗内存。
相反,这样做
User.find_each do |user|
user.authorization = 'enabled'
user.save!
end#find_each是一个activerecord方法,它一次只实例化一个用户对象。此外,它将查询分批到1000个用户的集合中,从而减少了给定时间的内存消耗。
在Rails 4中,在早期的Rails中,.all将结果加载到实例化对象的集合中。
编辑:
顺便说一句,这个一行程序将产生同样的效果,但是在一个查询中,并且没有加载任何数据或实例化任何对象(这是最节省内存和时间的解决方案):
User.update_all(authorization: 'enabled')发布于 2013-08-13 23:38:37
用批次代替
根据文件:
循环遍历数据库中的记录集合(例如,使用all方法)效率很低,因为它将尝试一次实例化所有对象。 在这种情况下,批处理方法允许您在批处理中处理记录,从而大大减少了内存消耗。
使用每一个而不是只迭代使用#each的对象数组通常会解决这个问题;如果没有,则减少:batch_size,直到它适合您的可用内存。
https://stackoverflow.com/questions/18220933
复制相似问题