首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Mongoid3解决15k用户使用“heroku运行控制台”出现的“内存不足”错误?

如何使用Mongoid3解决15k用户使用“heroku运行控制台”出现的“内存不足”错误?
EN

Stack Overflow用户
提问于 2013-08-13 23:29:20
回答 2查看 481关注 0票数 2

我正在'heroku运行控制台‘上运行15k个用户的代码,它超过512 of,如何优化该代码以停止内存不足?

代码语言:javascript
复制
User.all.each do |user|
  user.authorization = 'enabled'
  user.save!
end

为了简单起见,对这段代码进行了修改,在查询其他对象和user.authorization =“启用”时,我做了一些事情……我更想知道如何阻止内存泄漏?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-13 23:39:47

User.all返回一个延迟加载的activerecord关系*,对该关系调用#each将导致将该关系加载到实例化对象的集合中,这将根据数据库中的用户数消耗内存。

相反,这样做

代码语言:javascript
复制
User.find_each do |user|
   user.authorization = 'enabled'
   user.save!
end

#find_each是一个activerecord方法,它一次只实例化一个用户对象。此外,它将查询分批到1000个用户的集合中,从而减少了给定时间的内存消耗。

在Rails 4中,在早期的Rails中,.all将结果加载到实例化对象的集合中。

编辑:

顺便说一句,这个一行程序将产生同样的效果,但是在一个查询中,并且没有加载任何数据或实例化任何对象(这是最节省内存和时间的解决方案):

代码语言:javascript
复制
User.update_all(authorization: 'enabled')
票数 9
EN

Stack Overflow用户

发布于 2013-08-13 23:38:37

用批次代替

根据文件:

循环遍历数据库中的记录集合(例如,使用all方法)效率很低,因为它将尝试一次实例化所有对象。 在这种情况下,批处理方法允许您在批处理中处理记录,从而大大减少了内存消耗。

使用每一个而不是只迭代使用#each的对象数组通常会解决这个问题;如果没有,则减少:batch_size,直到它适合您的可用内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18220933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档