簡體   English   中英

R:並行呼叫應到達的深度

[英]R: At What Depth Should the Parallel Call Be In

我有一個嵌套的*apply調用,我想將它們並行化。 我可以選擇並行處理top調用或嵌套的內部調用。 筆者認為,從理論上講,第一個應該是更好的,但我的問題是,我有4個核心,但最外層的對象有5件是非常不同的尺寸。 當我運行第一個示例時,所有4個內核在其中2個完成之前都運行了大約10分鍾。 在第一個小時,第三個完成,而第四個是在1:45完成的最后一個,它完成了兩個最大的過程。

各自的優缺點是什么?

parLapply(cl, object, function(obj) lapply(obj, funct))

-- OR --

lapply(object, function(obj) parLapply(cl, obj, funct))

另外,有沒有一種方法可以手動分配負載? 這樣,我可以將兩個大對象分開,並將兩個最小的對象放在一起。

編輯:通常,CS理論對此情況有何陳述? 通常,這是進行並行調用的最佳位置(不包括此類特殊情況)

parLapply您的任務進行分組,因此每個集群工作器只有一組任務。 如果您需要負載平衡,那將無法正常工作,因此我建議您嘗試使用clusterApplyLB

clusterApplyLB(cl, object, function(obj) lapply(obj, funct))

如果您有5個任務和4個工作人員,這將在工作人員1-4上安排任務1-4,然后將任務5安排在首先完成任務的工作人員上。 這可能工作得很好,但是如果最后一個任務最短,它將更好地工作。

如果改為使用:

lapply(object, function(obj) clusterApplyLB(cl, obj, funct))

它將執行5個單獨的並行作業。 如果這些並行作業中的任務很小,那將是非常低效的,另外,您將浪費5個有負載平衡問題的作業中的每一個的資源。 因此,這種方法通常效果不佳。

通常,您希望使用第一種情況,但是當任務數不大於工作程序數時,負載平衡通常是一個嚴重的問題。 如果每個對funct調用花費合理的時間(例如至少幾秒鍾),則可以嘗試使用來自foreach包的嵌套運算符展開循環:

r <-
  foreach(obj=object) %:%
    foreach(o=obj) %dopar% {
      funct(o)
    }

這會將所有對funct的調用轉換為單個任務流,但仍將結果返回到列表列表中。

您可以在我寫的稱為Nesting Foreach Loops的小插圖中找到有關使用foreach嵌套運算符的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM