有没有办法在snow包中初始化类似于clusterEvalQ
和clusterExport
的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())
doSMP有initEnvir
选项,但?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
复制这些对象都是低效的。
即使没有现成的方法来做这件事,我也会很感激。
答案 0 :(得分: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)
答案 1 :(得分: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)
所有这些技术都在2.14中的新并行软件包之前工作,我相信这些技术已经完成了这些技术的统一。