欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Active Record batch processing in parallel processes

程序员文章站 2022-07-04 18:24:06
...
Active Record 提供 find_each来分批处理大量数据. 但是,当数据量在百万级别或是更多的时候find_each也会变得很慢。

采用像Resque这样的异步处理插件是一个不错的选择:

User.find_each {|user| Resque.enqueue(MyJob, user) }

但是用Resque有时候又有点杀鸡用牛刀的嫌疑,使用forking!
if GC.respond_to?(:copy_on_write_friendly=)
  GC.copy_on_write_friendly = true
end

jobs_per_process = 100
process_count = 10

User.find_in_batches(:batch_size => jobs_per_process * process_count) do |group|
  batches = group.in_groups(process_count)
    batches.each do |batch|
    Process.fork do
      ActiveRecord::Base.establish_connection
      # Do the actual work
      batch.each {|user| .. }
    end
  end
  Process.waitall
end

上面的代码一次性从数据库获取1000条记录,然后fork 10个进程,每个进并行处理100条记录,这样比串行处理1000条记录快多了。

如果考虑到并行处理会耗费额外的内存,使用REE是一个不错的选择.

原文地址
相关标签: resque activerecord