2014-09-30 76 views
-1

我正在尝试做一个批处理过程,它将采用一个参数来指定后台工作者的数量,并将一个集合分割成多个数组。例如,如果Ruby/Rails将数组拆分为N个组,并将其余组添加到最后一个组中。

def split_for_batch(number_of_workers) 
    <code> 
end 

array = [1,2,3,4,5,6,7,8,9,10] 

array.split_for_batch(3) 

=> [[1,2,3],[4,5,6],[7,8,9,10]] 

事情是,我不想一次加载所有的用户到内存中,因为它是一个批处理。我现在拥有的是

def initialize_audit_run_threads 
    total_users = tax_audit_run_users.count 
    partition_size = (total_users/thread_count).round 
    tax_audit_run_users.in_groups_of(partition_size).each do |group| 
     thread = TaxAuditRunThread.create(:tax_audit_run_id => id, :status_code => 1) 
     group.each do |user| 
     if user 
      user.tax_audit_run_thread_id = thread.id 
      user.save 
     end 
     end 
    end 

其中thread_count是确定后台工作者数量的类的属性。目前这段代码会创建4个线程而不是3个。我也尝试过使用find_in_batches,但是我遇到同样的问题,如果我在数组中有10个tax_audit_run_users,我无法让最后一个工作者知道处理最后一条记录。用红宝石或导轨将集合分为n个部分,最后一部分包含散布者吗?

+3

是否有必要在这里提到批处理,线程等?解压你想问的核心问题。看起来你只是想以某种方式将数组块化。但是由于你写的所有额外的东西,这是模糊的。很难理解你的问题。 – sawa 2014-09-30 20:51:56

+0

我在想,提及这方面很重要,因为我不想一次加载所有对象到内存中。我试图在第一部分中提炼它,但即使我有办法执行第一部分代码,由于批处理大小的限制,我仍然无法使用它 – 2014-09-30 20:54:18

+1

“我不想加载所有的物体一次进入记忆。“如果您从表中加载数据,则不要一次检索每条记录。根据DBM的不同,有多种方法可以选择性地返回数据块,但Active Record应该能够将这些数据抽象出来。 – 2014-09-30 21:18:06

回答

1

How to split (chunk) a Ruby array into parts of X elements?

你当然会需要稍作修改添加的最后一个块,如果是小于块大小,还是不行,给你。

+0

我读过那篇文章,这是我从in_groups_of得来的。我仍然无法找到一种方法来处理这个问题,而无需一次将所有内容加载到内存中。 – 2014-09-30 20:57:06

+1

您是否正在从数据库中加载tax_audit_run_users?通过您发布的代码,您已经将所有用户加载到内存中。如果你不想把所有的TaxAuditRunThread对象加载到内存中,你就不会。垃圾收集应该在离开“组”区块时清除这些垃圾。 也许你可以详细说明**“全部”**是什么意思,因为这是一个**真**模糊的短语。 – mattforni 2014-09-30 21:35:11

相关问题