2014-09-30 49 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

相關問題