2011-04-29 44 views
1

我有一些rake脚本可以处理数十万个项目的集合。Rails:使用大型集合

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

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

据我所知,通过Rails的每个实例获取整个集合到内存中,然后进行迭代。

我的服务器似乎并没有成为Asset快乐装载300000个实例一次,所以为了减少对内存的要求,我不得不求助于这样的事情:

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

不幸的是,看起来不太干净。当动作没有从集合中移除项目时,情况变得更糟,我也必须跟踪offset。有没有人有更好的方式来分区数据或保持关系更长的建议,只有根据需要加载行?

回答

2

find_each方法旨在帮助这些情况。它会

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

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

+0

完美。谢谢! – Jeriko 2011-04-29 13:36:14