我正在測試parLapplyLB()
函數以瞭解它如何平衡負載。但我沒有看到任何平衡發生。例如,爲什麼parLapplyLB沒有實際平衡負載?
cl <- parallel::makeCluster(2)
system.time(
parallel::parLapplyLB(cl, 1:4, function(y) {
if (y == 1) {
Sys.sleep(3)
} else {
Sys.sleep(0.5)
}}))
## user system elapsed
## 0.004 0.009 3.511
parallel::stopCluster(cl)
如果它被真正平衡該休眠3秒鐘的負荷,所述第一作業(作業1)將在第一節點和其他三個作業(作業2:4)上會睡在另一個節點上總共1.5秒。總共系統時間應該只有3秒。
相反,我認爲作業1和2給予節點1,作業3和4給予節點2.這導致總時間爲3 + 0.5 = 3.5秒。如果我們使用parLapply()
而不是parLapplyLB()
運行上述相同的代碼,我們得到的系統時間約爲3.5秒。
我不理解或做錯什麼?
我認爲R不會做自動負載平衡。我認爲它將*任務*劃分爲儘可能多的核心,而不管每個任務需要多少時間,或者每個任務何時完成。這並不是說有一個任務隊列,當一個工作人員完成時,抓住下一個任務。每個核心都分配了兩個任務。因此,第一名工人的3 + 0.5,總共3.5。 *會很高興出錯* – gregmacfarlane
是的,這就是3.5來自哪裏。這不是平衡負載。但parLapplyLB聲稱要平衡。 – josiekre