Kam*_*i81 2 ruby heroku ruby-on-rails-3
我在"heroku运行控制台"上运行以下代码超过15k用户,它超过512MB,如何优化此代码以停止内存耗尽?
User.all.each do |user|
user.authorization = 'enabled'
user.save!
end
Run Code Online (Sandbox Code Playgroud)
这段代码是为了简单而修改的,我在查询其他对象方面做了一些事情VS user.authorization ='enabled'...我更想知道如何阻止内存泄漏?
User.all返回延迟加载的activerecord关系*,调用#each该关系会导致关系被加载到实例化对象的集合中,这会占用与数据库中用户数成比例的内存.
相反,这样做
User.find_each do |user|
user.authorization = 'enabled'
user.save!
end
Run Code Online (Sandbox Code Playgroud)
#find_each是一个activerecord方法,一次只实例化一个用户对象.此外,它将查询批量分组为1000个用户,从而减少给定时间的内存消耗.
*在Rails中4.在早期的Rails中,.all将结果加载到实例化对象的集合中.
编辑:
顺便说一句,这个单行将具有相同的效果,但在单个查询中并且不加载任何数据或实例化任何对象(这是最节省内存和时间的解决方案):
User.update_all(authorization: 'enabled')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |