Active Record batch processing in parallel processes
程序员文章站
2022-07-04 18:24:06
...
Active Record 提供 find_each来分批处理大量数据. 但是,当数据量在百万级别或是更多的时候find_each也会变得很慢。
采用像Resque这样的异步处理插件是一个不错的选择:
但是用Resque有时候又有点杀鸡用牛刀的嫌疑,使用forking!
上面的代码一次性从数据库获取1000条记录,然后fork 10个进程,每个进并行处理100条记录,这样比串行处理1000条记录快多了。
如果考虑到并行处理会耗费额外的内存,使用REE是一个不错的选择.
原文地址
采用像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是一个不错的选择.
原文地址
上一篇: 【赵强老师】Oracle数据库的存储结构