Active Record batch processing in parallel processes

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是一个不错的选择.

原文地址

你可能感兴趣的:(ActiveRecord,resque)