2015-09-08 37 views
0

所有官方教程doParalleldoParallel-VignettedoMCdoMC-Vignette我發現迄今只涵蓋了如何結合使用並行計算與foreach。有沒有辦法加快「順序」編碼?使用doParallel/DOMC不僅用foreach包

想象一下,它像將一個文件分成多個文件並執行每個文件與R的不同實例。例如。

## <run on core1> 
data1 <- getData1() 
dataResult1 <- doComplexAlgorithm1(data1) 
## </run on core1> 

## <run on core2> 
data2 <- getData2() 
dataResult2 <- doComplexAlgorithm2(data2) 
## </run on core2> 

## <run on core3> 
data3 <- getData3() 
dataResult3 <- doComplexAntotherAlgorithm3(data3) 
## </run on core3> 

## <run on core4> 
data4 <- getData4() 
dataResult4 <- doComplexNotSoComplexAlgorithm4(data4) 
## </run on core4> 

在此先感謝!

(R v.3.2.1,RStudio v.0.99.451

回答

1

這聽起來像你想要做什麼,我嘗試用圖像做。 我有一些圖像和一些計算,它本身需要很長的時間。我這樣做的方式是有文件的列表,以及:

foreach (i =1:length(fileList)) %dopar% { 
    - load data 
    - do something 
    - write result to disk 
} 

這就像你說的,每一組數據(文件),對自己的核心處理提供系統有足夠的內存來容納這一切立刻。

+0

感謝您的回覆!問題是,在不同部分完成的操作差異很大。它是一個sql-command和一些數據準備過程的混合體。我加強了我的問題,使之更加清晰。 – Boern

2

在基地(單進程)的情況下,你會使用mapply,傳遞你的函數列表:

mapply(function(getData, doAlg) { 
    dat <- getData() 
    doAlg(dat) 
}, 
getData=list(getData1, getData2, getData3, getData4), 
doAlg=list(algorithm1, algorithm2, algorithm3, algorithm4)) 

在並行處理的情況下,你可以使用clusterMap

library(parallel) 
cl <- makeCluster() 
clusterMap(cl, function(getData, doAlg) { 
    dat <- getData() 
    doAlg(dat) 
}, 
getData=list(getData1, getData2, getData3, getData4), 
doAlg=list(algorithm1, algorithm2, algorithm3, algorithm4)) 
0

所以你不需要任何內存共享或每個工作之間的溝通,或者他們是獨立的工作。

foreach或lapply範例更適用於分割循環或向量進程。對於完全單獨的作業,您需要包裝另一個圖層以使其成爲一個循環。

將每個部分包裝成一個函數,將所有函數放入一個列表中,然後循環調用每個函數。

fun_list <- list(
    fun_1 <- function() { 
    data1 <- getData1() 
    doComplexAlgorithm1(data1) 
}, 
    fun_2 <- function() { 
    data2 <- getData1() 
    doComplexAlgorithm2(data2) 
}, 
... 
)