2012-02-22 103 views
6

在多核上使用doSNOW包訪問/寫入全局變量時是否存在問題?使用doSNOW寫入全局變量並在R中進行並行化?

在下面的程序,每個MyCalculations(II)的寫入矩陣「全局變量」的第II個列...

你認爲結果會是正確的嗎?會有隱藏的漁獲物嗎?

非常感謝!

p.s.我必須寫出全局變量,因爲這是一個簡單的例子,事實上,我有許多輸出需要從並行循環內傳輸......因此,可能唯一的辦法就是寫出全局變量。 ..

library(doSNOW) 
MaxSearchSpace=44*5 
globalVariable=matrix(0, 10000, MaxSearchSpace) 
cl<-makeCluster(7) 
registerDoSNOW(cl) 
foreach (ii = 2:nMaxSearchSpace, .combine=cbind, .verbose=F) %dopar% 
    { 
    MyCalculations(ii) 
    } 

stopCluster(cl) 

ps我要求 - 在DoSnow框架內,在那裏訪問/寫入全局變量... THX

+1

您可以考慮使用[doRedis(https://github.com/bwlewis/doRedis),這將處理您的問題與需要訪問全局變量。 – daroczig 2012-02-23 10:16:39

回答

7

由於這個問題是一對夫婦個月大的危險,我希望你現在已經找到了答案。但是,如果您仍然對反饋感興趣,請注意以下事項:

當使用帶有並行後端的foreach時,您將無法以您嘗試的方式分配給R全局環境中的變量(你可能注意到了這一點)。使用順序後端,分配的工作,但不使用並行一個像doSNOW

相反,保存計算的所有結果列表中的每個迭代,這返回一個對象,讓所有的計算都完成後,就可以提取相應的結果。

我的建議同樣開始你的例子:

library(doSNOW) 
MaxSearchSpace <- 44*5 
cl <- makeCluster(parallel::detectCores()) 

# do not create the globalVariable object 

registerDoSNOW(cl) 

# Save the results of the `foreach` iterations as 
# lists of lists in an object (`theRes`) 

theRes <- foreach (ii = 2:MaxSearchSpace, .verbose=F) %dopar% 
    { 
# do some calculations 
    theNorms <- rnorm(10000) 
    thePois <- rpois(10000, 2) 
# store the results in a list 
    list(theNorms, thePois) 
    } 

所有迭代已經完成後,從theRes提取結果並將它們存儲爲對象(例如,globalVariableglobalVariable2等)

globalVariable1 <- do.call(cbind, lapply(theRes, "[[", 1)) 
globalVariable2 <- do.call(cbind, lapply(theRes, "[[", 2)) 

考慮到這一點,如果執行的是在每次迭代依賴於從以前的迭代計算的結果計算,那麼這種類型的並行計算的不是Appro公司要採取。