gpt4 book ai didi

r - 使用 doSNOW 写入全局变量并在 R 中进行并行化?

转载 作者:行者123 更新时间:2023-12-04 11:28:35 26 4
gpt4 key购买 nike

在多核上使用 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 框架内,是否有访问/写入全局变量的危险......谢谢

最佳答案

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

使用时 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))

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

关于r - 使用 doSNOW 写入全局变量并在 R 中进行并行化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com