Ruby 我如何解决;“内存不足”;错误与';heroku运行控制台';对于15k用户,是否使用Mongoid3?
我在“heroku run console”上运行的代码超过了15k个用户,超过512MB,我如何优化此代码以避免内存不足Ruby 我如何解决;“内存不足”;错误与';heroku运行控制台';对于15k用户,是否使用Mongoid3?,ruby,ruby-on-rails-3,heroku,Ruby,Ruby On Rails 3,Heroku,我在“heroku run console”上运行的代码超过了15k个用户,超过512MB,我如何优化此代码以避免内存不足 User.all.each do |user| user.authorization = 'enabled' user.save! end 这段代码是为了简单而修改的,我在查询其他对象和用户方面做了一些事情。authorization='enabled'…我更想知道如何阻止内存泄漏?改用批处理 根据文件: 循环数据库中的记录集合(例如,使用all方法)效率非常低,
User.all.each do |user|
user.authorization = 'enabled'
user.save!
end
这段代码是为了简单而修改的,我在查询其他对象和用户方面做了一些事情。authorization='enabled'…我更想知道如何阻止内存泄漏?改用批处理
根据文件:
循环数据库中的记录集合(例如,使用all方法)效率非常低,因为它将尝试一次性实例化所有对象
在这种情况下,批处理方法允许您批量处理记录,从而大大减少内存消耗
使用#而不仅仅是使用#遍历对象数组通常可以解决此问题;如果没有,请减小批处理大小,直到它适合可用RAM。
用户。all
返回延迟加载的activerecord关系*,调用该关系上的每个,将该关系加载到实例化对象的集合中,它消耗的内存与数据库中的用户数成比例
相反,要这样做
User.find_each do |user|
user.authorization = 'enabled'
user.save!
end
#find_each
是一个activerecord方法,一次只实例化一个用户对象。此外,它将查询分批成1000个用户的集合,这减少了给定时间的内存消耗
*在Rails 4中。在早期的Rails中,.all
将结果加载到实例化对象的集合中
编辑:
顺便说一句,这一行程序将具有相同的效果,但在单个查询中,无需加载任何数据或实例化任何对象(这是最节省内存和时间的解决方案):
这是常规代码吗?或者您只想运行一次?如果没有任何重要的回调,只需在数据库中执行。
User.update_all(authorization: 'enabled')