Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我如何解决;“内存不足”;错误与';heroku运行控制台';对于15k用户,是否使用Mongoid3?_Ruby_Ruby On Rails 3_Heroku - Fatal编程技术网

Ruby 我如何解决;“内存不足”;错误与';heroku运行控制台';对于15k用户,是否使用Mongoid3?

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方法)效率非常低,

我在“heroku run console”上运行的代码超过了15k个用户,超过512MB,我如何优化此代码以避免内存不足

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')