【问题标题】:How to use the source() function in a parallized loop (doSMP)?如何在并行循环 (doSMP) 中使用 source() 函数?
【发布时间】:2011-06-22 09:44:36
【问题描述】:

我正在尝试使用 doSMP 包通过“foreach”循环加速我的代码。

这是我的问题的简化版本:我正在运行一个名为 main.R 的文件

文件:main.R:

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

文件: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() 函数。

【问题讨论】:

    标签: r foreach parallel-processing


    【解决方案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"
    

    【讨论】:

    • 我是罗马人,我测试了你的代码并得到了同样的问题:你的 tiny_script.R 没有使用任何变量。如果不是 date() 您有一个需要变量的函数,例如我的: message(dropbox_path) where dropbox_path 在全局环境中,您会得到相同的错误。我的问题是源代码中的脚本如何使用父环境的变量(子环境可以访问,如我在第二个示例中演示的那样)?
    • @Sam 您必须将所有变量导出到核心。 sfExport(list = c("var1", "var2", "function1")).
    • ok message() 函数不起作用,但是 source(script.R) 可以访问变量。我会看看我是否可以使用降雪包而不是 doSMP
    • @Sam 到目前为止,我在并行会话中写入控制台是不成功的(我认为每个核心进程都是一个单独的 R 控制台,据我所知,你不能从一个控制台到另一个)。不过,附加到文件应该可以。
    • @Sam 这是一个棘手的问题。 snowfallapply 系列函数配合使用效果最好,并且 AFAICT 并非设计用于与迭代器一起使用。有可能的变通方法,请参见此处:stackoverflow.com/questions/4164960/…
    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 2018-09-23
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多