Ruby / Rails内存使用情况

时间:2010-09-15 20:38:54

标签: ruby-on-rails ruby memory-management

嘿伙计们,在下面的代码中:

  def process(batch_size=1000)
     claim_numbers.each_slice(batch_size) do |numbers_batch|
       claims = Claim.find(:all, :conditions => ["claim_number in (?)", numbers_batch])
       # do something with claims
     end
   end

在我的一个Rails模型中,我正在处理大量claim_numbers,我正在模拟find_in_batches方法,以便不将大量记录加载到内存中,然后我的问题是:就内存而言,每次迭代中claims变量会发生什么? Ruby的GC什么时候发布那部分内存?

任何帮助和提示将不胜感激,提前谢谢!

更新:使用Ruby 1.8.7-p72

1 个答案:

答案 0 :(得分:1)

Ruby会在GC运行后立即释放内存。由于声明的范围在each_slice块内,因此声明在块之外没有引用,并且在重新分配声明时(由于下一次迭代),先前分配的对象变为未引用。 在GC启动之前,每个对象的内存都会保留。可以使用某些环境变量指定GC运行的频率(http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/处的更多信息)。

如果由于某种原因你保留了对象(因为仍然有对它的引用,例如你将对象放在数组或散列中),那么该对象的内存不会被释放。 如果您监视您的应用程序,您可以看到内存使用量增加,但也增加了CPU使用率,因为ruby的GC是非代数的,这意味着它每次都会遍历所有对象,以查看是否可以收集它们。