我正在尝试做一个批处理过程,它将采用一个参数来指定后台工作者的数量,并将一个集合分割成多个数组。例如,如果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个部分,最后一部分包含散布者吗?
是否有必要在这里提到批处理,线程等?解压你想问的核心问题。看起来你只是想以某种方式将数组块化。但是由于你写的所有额外的东西,这是模糊的。很难理解你的问题。 – sawa 2014-09-30 20:51:56
我在想,提及这方面很重要,因为我不想一次加载所有对象到内存中。我试图在第一部分中提炼它,但即使我有办法执行第一部分代码,由于批处理大小的限制,我仍然无法使用它 – 2014-09-30 20:54:18
“我不想加载所有的物体一次进入记忆。“如果您从表中加载数据,则不要一次检索每条记录。根据DBM的不同,有多种方法可以选择性地返回数据块,但Active Record应该能够将这些数据抽象出来。 – 2014-09-30 21:18:06