2011-04-29 54 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