find_in_batches

在Rails中,我们经常要取出大量的数据进行一定的操作,例如这样的:

1
2
3
Project.all.each do |project| 
...
end

如果Project这张表有上千条上万条甚至更多的数据,会发生什么情况?Rails会将所有的数据取出,加载在内存里面,然后再进行循环。这个时候你会发现Rails的进程内存占用急剧增大,程序卡住许久才开始执行循环里面的代码,甚至有可能机器配置不够引起程序崩溃!

于是便有了find_in_batches这个方法,顾名思义,它就是按批次来取数据,避免一次性加载过多的数据。

这里是Rails的官方文档:http://api.rubyonrails.org/classes/ActiveRecord/Batches.html

使用起来是这样的:

1
2
3
Person.find_in_batches(start: 2000, batch_size: 2000) do |group| 
group.each { |person| person.party_all_night! }
end

有两个参数
::batch_size - Specifies the size of the batch. Default to 1000. 每批次取出的数据数量

:start - Specifies the starting point for the batch processing. 开始的位置

另外还有一个更简洁的方法,find_each,实质上也是使用find_in_batches方法的封装:

1
2
Person.find_each(start: 2000, batch_size: 2000) do |person| person.party_all_night!
end