2012-05-11 46 views
1

當數據只包含在一個列表或矩陣中時,雪包parXapply()函數非常好地分配工作,但在這種情況下,我需要在四種不同類型的矩陣上運行函數。在雪簇上分發列表

例如,這是我現在有:

res.list = parLapply(cl, mynames, myfun, listA, listB, listC, listD) 

myfun = function(name, listA, listB, listC, listD) { 
    matrixA = listA[[name]] 
    matrixB = listB[[name]] 
    matrixC = listC[[name]] 
    matrixD = listD[[name]] 
} 

我遇到的問題是,矩陣是非常大的,我懷疑在全名單調用parLapply()涉及的所有數據轉移到每個羣集節點。這可能非常耗時並降低了羣集性能。

如何在調用myfun()之前分割列表並僅將相關矩陣發送到每個節點進行處理?

+0

看起來像mapply()是我需要的,但它不是在雪中可用。 –

回答

3

的ClusterMap()做工作:

res.list = clusterMap(cl, myfun, mynames, listA, listB, listC, listD) 

不知何故,parMapply()包裝被留出來的包。

0

我認爲羅伯特庫布裏克給出的答案最好使用clusterMap來回答這個問題。不過,我認爲其他人在尋找相關問題的答案時可能會從另一個選項 - mcmapply(這是mapply的多核版本)中受益。例如:

mcmapply(rep, 1:4, 4:1) 

mcmapply實現了並行使用mapply分叉,這意味着它是不Windows機器上的一個選項。此外,如果您在GUI中運行R,可能會出現複雜情況。順便提一下,mclapply也是lapply的多核版本。

因此mcmapplymclapply是你可能期望稱爲parMapplyparLapply的最簡單版本。