首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少RoR脚本中拼音的内存使用量

减少RoR脚本中拼音的内存使用量
EN

Stack Overflow用户
提问于 2013-02-14 23:15:38
回答 3查看 593关注 0票数 0

我有一个RoR应用程序和一个cron rake-task,类似于:

代码语言:javascript
复制
Model.all.each do |m|
  if m < some_condition
    m.do_something
    m.save
  end
end

Model有1,000,000条记录(其中有200,000条条件可接受)。有什么方法可以提高任务内存的使用率吗?它占用了on的内存,并且Ruby进程在生产环境中被服务器终止。我的数据库是PostgreSQL。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-14 23:17:51

你应该使用像#find_each#find_in_batches这样的方法。这些操作一次只加载一小部分记录。看看ActiveRecord::Batches吧。

票数 2
EN

Stack Overflow用户

发布于 2013-02-14 23:20:17

我建议使用find_each,它可以批量生成您的对象。

此外,如果可能,在sql中应用您在循环中的条件,这样ActiveRecord就不必实例化您不使用的对象(并因此使用内存):

代码语言:javascript
复制
Model.find_each(:conditions => {:my => :condition}).each do |m|
  # do something
end
票数 2
EN

Stack Overflow用户

发布于 2013-02-15 00:14:07

您可以尝试以下方法:

代码语言:javascript
复制
  def with_gc(enum)
    count = enum.count
    limit = 100
    (0..count).select{|i| i % limit == 0}.each do |index|
      new_count = enum.count
      raise "query depends on updated param. Expected count #{count}, got #{new_count}" if count != new_count
      enum.skip(index).limit(limit).each do |record|
        yield record
      end
      GC.start
    end
  end

你可以这样使用它:

代码语言:javascript
复制
with_gc(Model.all) do |m|
  if m < some_condition
    m.do_something
    m.save
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14877984

复制
相关文章

相似问题

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