2011-10-04 26 views
5

有沒有辦法在雪包中初始化類似clusterEvalQclusterExport的doSMP集羣?例如:如何使用doSMP初始化工作人員?

x <- 1:10 
y <- 10:1 
z <- rnorm(10) 
cl <- makeSOCKcluster(2) 
clusterEvalQ(cl, library(quantmod)) 
clusterExport(cl, list("x","y","z")) 
clusterEvalQ(cl, ls()) 
clusterEvalQ(cl, search()) 

有一個initEnvir選項doSMP,但?doSMP

‘initEnvir’ is a function to be executed by each worker before any 
tasks are executed associated with a foreach. Its purpose is to 
initialize the execution environment, or the worker in general. 
It is only executed by a worker if that worker executes at least 
one task associated with the foreach. 

每個工人需要幾個大型對象的副本才能運行我發送到表達式foreach。此外,我需要撥打foreach幾百次,並使用這些大對象的相同版本。每次調用foreach時複製這些對象都是低效的。

即使沒有現成的方法來做到這一點,我會欣賞一個kludge。

+0

我想有進入基礎環境,這將抵消需要複製。或者我錯過了什麼? – Iterator

+2

只是好奇你爲什麼要用doSMP而不是雪來實現?我發現雪更加穩定和便攜。 – darckeen

+0

@darckeen:我不是隻用doSMP來實施。我正在爲用戶創建選項,以便使用他們選擇的任何後端,包括doSMP。 –

回答

1

foreach的第一個參數是...,它傳輸用於評估目標表達式的迭代對象。如果只需要對象的一部分,那麼使用iter僅傳遞對象的某些部分可能會更有效。

w <- startWorkers(workerCount = 4) 
registerDoSMP(w) 

foreach(x=iter(x),y=iter(y),z=iter(z)) %dopar% (x*y*z) 

在調用環境中的對象仍然可用:

foreach(1:10) %dopar% (x*y*z) # Somewhat repetitious # 

zed <- 20:1 
foreach(x=iter(x)) %dopar% (x*zed) 
+0

您的最後一個示例與我正在嘗試的最接近,除了'zed'是幾百MB,並且該示例將在遺傳算法優化期間運行數百次或數千次。複製數千次'foreach'電話的'zed'將會很昂貴。 –

0

試試這個:

library(doSMP) 
library(foreach) 
w <- startWorkers(workerCount = 4) 
registerDoSMP(w) 
foreach(i = 1:3) %dopar% sqrt(i) 

或者你可以使用doSNOW和

registerDoSNOW(cl) 

http://cran.r-project.org/web/packages/doSNOW/doSNOW.pdf

最後,還有DOMC(不適用於Windows)

library(doMC) 
registerDoMC() 
foreach(i = 1:3) %dopar% sqrt(i) 

所有這些技術hniques在2.14的新並行包之前工作,我相信這已經完成了這些技術的一些統一。

+0

這不回答我的問題。在調用'foreach'之前,我需要將對象複製到工作人員。我知道其他後端,但我需要'doSMP'的解決方案(請參閱我的評論)。 –