2013-05-10 18 views
2

調用parLapply()時將多少個列表元素髮送給每個工作進程?例如,假設我們有一個包含SOCK羣集中的6個元素和2個工作人員的列表。 parLapply()會在一次發送調用中向每個工作人員發送兩個列表元素,還是每次發送一個元素?雪是如何向工作人員分發清單元素的?

我想盡量減少我的集羣通信開銷(我有很多列表元素,可以由每個CPU相對較快地處理),從我在htop CPU計量器上看到的看起來像雪它發送一個列表元素的時間。是否可以設置在一次發送呼叫中分派的列表元素的數量?

回答

4

parLapply功能將輸入到每個工人一個塊。它是與splitList功能,如在的parLapply的implentation:

function (cl = NULL, X, fun, ...) 
    do.call(c, clusterApply(cl, x = splitList(X, length(cl)), fun = lapply, 
          fun, ...), quote = TRUE) 

因此,與6元和2名的員工名單中,它會發送3個元素給每個工人每一個「發送」操作工人。這是類似的mclapplymc.preschedule設置爲TRUE(默認值)的行爲。

如此看來,parLapply已經執行所需的優化。

很有趣的是,通過簡單地在parLapply定義改變lapplymclapply,您可以創建一個混合並行編程功能,可能與有許多內核的節點工作得非常好。

+0

我同意的結論,但沒有證據相信,直到我通過'splitList'到'splitIndices'遵循的代碼。 – 2013-05-10 17:44:04

+0

@DWin:也許我應該包括執行'庫(雪)的結果; splitList(1:6,2)'作爲證據。我永遠不知道要進入多少細節。我通常會進入太多... – 2013-05-10 17:55:49

+0

事實上,我完全錯過了parLapply代碼中的splitList調用。 – 2013-05-10 17:55:50

相關問題