我有一些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。有没有人建议更好的方法来分割数据或保持更长的关系,并且只在必要时加载行?
答案 0 :(得分:2)
find_each方法旨在帮助解决这些问题。它会
Asset.where(:archived => false).find_each(:batch_size=>500) do |asset|
asset.stuff
end
默认情况下,批量大小为1000