2013-03-18 50 views
0

軌2.3.14,紅寶石1.8.7Ruby on Rails的內存泄漏

我有一個耙子任務:

Post.all.each do |post| 

     post.comments.each { |pc| 
     pc.delete 
     } 
     user = post.user 

     pc = user.comment.build(
      :text => 'Test text', 
     ...... 
    ) 
     result = pc.send_comment_http 

     if result.success? 
     pc.save! 
     else 
     puts error_message 
     end 
    end 

郵政也100K行和任務運行50H alredy,行添加每3秒在分貝,它沒有問題,但ps -ax | grep rake表示佔用2 GB。什麼可能是內存泄漏的問題?

回答

2

使用

Post.find_each do |post| 
    ...  
end 
+0

是的,您是對的。 http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects「但是隨着表格大小的增加,這種方法變得越來越不切實際,因爲User.all.each指示Active Record一次獲取整個表格,每行構建一個模型對象,然後將整個模型對象數組保存在內存中。實際上,如果我們有大量記錄,整個集合可能會超過可用內存量。「 – Nar 2013-03-18 11:00:57

3

評論的迭代。第二個循環,你可以通過以下方式避開它:post.comments.destroy_all

此外,當用戶發表評論時,我可以看到它與帖子無關(因爲用戶可以有很多帖子,對吧?),所以你可以分開操作。首先直接截取評論表,然後獲取與帖子相關的用戶(如果您希望爲每個帖子發送一條消息,您可以使用joingroup by,或者只使用join),第三次遍歷用戶併發送消息。

+0

你的決定應該加快,但它肯定不會解決問題內存泄漏。 – Nar 2013-03-18 06:31:01

+1

delete_all沒問題,但應該小心使用,因爲它不會觸發ActiveRecord回調 – 2013-03-18 13:48:05