Rails:使用大型集合

时间:2011-04-29 13:05:06

标签: ruby-on-rails activerecord

我有一些rake脚本可以运行数十万个项目的集合。

通常,我的服务器内存不足,脚本崩溃。我认为这是因为我的代码看起来像这样:

Asset.where(:archived => false).each { |asset| asset.action! }

据我所知,Rails将整个集合提取到内存中,然后遍历每个实例。

我的服务器似乎不高兴同时加载300,000个Asset个实例,所以为了减少内存需求,我不得不求助于这样的事情:

collection = Asset.where(:archived => false) # ActiveRecord::Relation
while collection.count > 0
  collection.limit(1000).each { |asset| asset.action! }
end

不幸的是,这似乎不太干净。当动作没有从集合中删除项目时,情况会变得更糟,我也必须跟踪offset s。有没有人建议更好的方法来分割数据或保持更长的关系,并且只在必要时加载行?

1 个答案:

答案 0 :(得分:2)

find_each方法旨在帮助解决这些问题。它会

Asset.where(:archived => false).find_each(:batch_size=>500) do |asset|
  asset.stuff
end

默认情况下,批量大小为1000