0

我正在Rails 2.3.11環境中工作。內存和性能高效的查找記錄和種子到表中的方法

我想播種social_activities表所示:

votes = Vote.find(:all, :limit => 10000, :order => 'created_at DESC') 
for vote in votes do 
    act = vote.activity_for! 
    act.created_at = vote.created_at 
    act.save! 
end 

comments = Comment.find(:all, :limit => 10000, :order => 'created_at DESC') 
for comment in comments do 
    act = comment.activity_for! 
    act.created_at = comment.created_at 
    act.save! 
end 

......然後......等等......

正如你所看到的,我處理了很多紀錄。我如何以最高效的內存和性能方式來做到這一點?

回答

0

而不是一次獲取10000條記錄,您可以通過減小此數字(比如說100),並使用find_each來通過所有記錄來減少內存中的對象數量。

Vote.find_each(:order => 'created_at DESC', :batch_size => 100) do |vote| 
    act = vote.activity_for! 
    act.created_at = vote.created_at 
    act.save! 
end 

Comment.find_each(:order => 'created_at DESC', :batch_size => 100) do |comment| 
    act = comment.activity_for! 
    act.created_at = comment.created_at 
    act.save! 
end 

現在每次只能抓取100個記錄,減少內存佔用量。

0

活動記錄對於導入或移動大型數據集並不好。這看起來像你應該直接用SQL語句做的事情。

在SQL中,我認爲你可以通過內部連接或類似的東西進行更新。無論哪種方式,SQL服務器都會直接運行您的查詢,這將比Active Record快得多。

+0

如果您決定走這條路線,請在sql下發佈一個問題,詳細說明您的表格以及您想要導入的字段。 – jdeseno 2011-05-17 14:53:30