如何在并行循环(doSMP)中使用source()函数?

时间:2011-06-22 09:44:37

标签: r foreach parallel-processing

我正在尝试使用doSMP包使用'foreach'循环来加速我的代码。

以下是我的问题的简化版本:我正在运行名为main.R

的文件

file:main.R:

require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4 ) %dopar% source("test.R")
stopWorkers(workers)

file:test.R:

message(dropbox_path)

返回以下错误: “源代码错误(”test.R“):   任务1失败 - “找不到对象'dropbox_path'”

如果我将main.R修改为:

require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4 ) %dopar% message(dropbox_path)
stopWorkers(workers)

然后效果很好。 它也常用于顺序代码('for'而不是'foreach')。

所以R子实例可以访问dropbox_path变量,但不能通过源函数解析它。我尝试使用source()函数参数'local'和'chdir'而没有成功。

您是否知道代码的工作方式?我想继续使用source()函数。

1 个答案:

答案 0 :(得分:1)

我提前道歉我的小解决方法不使用你的工具,但这是我将如何做到的。我使用包snowfall因为我可以轻松扩展我的应用函数以在多个核上工作。代码未经过测试,因为我的所有内核都已被占用。但是应该可以工作。

tiny_script.R内容:

date()

用于启动多个核心的R代码:

library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK") #power up
my.list <- vector("list", 10)

sfLapply(x = my.list, fun = function(x) source("./Odpad/tiny_script.R")) 

仅使用lapply在单核上运行:

> lapply(X = my.list, FUN = function(x) source("./Odpad/tiny_script.R")) #notice the difference in argument names between `lapply` and `sfLapply`.
[[1]]
[[1]]$value
[1] "Wed Jun 22 13:02:11 2011"

[[1]]$visible
[1] TRUE


[[2]]
[[2]]$value
[1] "Wed Jun 22 13:02:11 2011"