2013-03-18 57 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