【问题标题】:writing to global variables in using doSNOW and doing parallelization in R?使用doSNOW写入全局变量并在R中进行并行化?
【发布时间】:2012-03-13 09:01:41
【问题描述】:

在多核上使用doSNOW包访问/写入全局变量是否有问题?

在下面的程序中,每个 MyCalculations(ii) 写入矩阵“globalVariable”的第 ii 列...

你认为结果会正确吗?会有隐藏的陷阱吗?

非常感谢!

附言我必须写出全局变量,因为这是一个简单的示例,实际上我有很多输出需要从并行循环中传输……因此,可能唯一的方法是写出全局变量。 ..

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)

附言我在问 - 在 DoSnow 框架内,是否存在访问/写入全局变量的危险...... thx

【问题讨论】:

  • 您可以考虑使用doRedis 来解决您需要访问全局变量的问题。

标签: r foreach


【解决方案1】:

由于这个问题是几个月前的问题,我希望您现在已经找到了答案。但是,如果您仍然对反馈感兴趣,可以考虑以下几点:

foreach 与并行后端一起使用时,您将无法以您尝试的方式分配给 R 的全局环境中的变量(您可能已经注意到这一点)。使用 sequential 后端,分配将起作用,但不能像 doSNOW 那样使用 parallel

相反,将每次迭代的所有计算结果保存在一个列表中并将其返回给一个对象,以便在所有计算完成后提取适当的结果。

我的建议与您的示例类似:

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))

考虑到这一点,如果您在每次迭代中执行的计算都依赖于先前迭代的计算结果,那么这种类型的并行计算不适合采用。

【讨论】:

  • 是否仍然无法从 foreach 循环中写入全局变量?列表对我不起作用,因为我使用 foreach 循环将一个元素从一个数组分配给另一个数组。前list1[i]=list2[i-4]
  • @NikitaBelooussov 是否可以在完成计算后分配?还是计算相互依赖?
  • 计算不相互依赖。问题是我无法分配我正在使用的程序,不允许将列表一次全部分配给变量,并且需要一次完成一个。
  • @NikitaBelooussov,我不确定我是否完全理解您正在使用的程序的限制。在我看来,您的情况需要提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多