2012-02-22 77 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公司要采取。