我正在嘗試做一個批處理過程,它將採用一個參數來指定後臺工作者的數量,並將一個集合分割成多個數組。例如,如果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