嘿伙计们,在下面的代码中:
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
答案 0 :(得分:1)
Ruby会在GC运行后立即释放内存。由于声明的范围在each_slice块内,因此声明在块之外没有引用,并且在重新分配声明时(由于下一次迭代),先前分配的对象变为未引用。 在GC启动之前,每个对象的内存都会保留。可以使用某些环境变量指定GC运行的频率(http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/处的更多信息)。
如果由于某种原因你保留了对象(因为仍然有对它的引用,例如你将对象放在数组或散列中),那么该对象的内存不会被释放。 如果您监视您的应用程序,您可以看到内存使用量增加,但也增加了CPU使用率,因为ruby的GC是非代数的,这意味着它每次都会遍历所有对象,以查看是否可以收集它们。