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
。有没有人有更好的方式来分区数据或保持关系更长的建议,只有根据需要加载行?
完美。谢谢! – Jeriko 2011-04-29 13:36:14