【问题标题】:Parallelization of outer loop works in REvolution, but not in normal R外循环的并行化在 REvolution 中有效,但在普通 R 中无效
【发布时间】:2012-05-13 04:34:48
【问题描述】:

我正在尝试并行化外循环,同时按顺序运行内循环。以下代码在使用 doSMP 包时可以在 Revolution 中使用,但在使用 foreachdoParallel 包(Windows 机器上的两个 R 版本)时,它在基本 R 中不起作用。错误消息是:could not find function "%do%"。任何想法如何解决这个问题?

foreach(j = X, .combine = c) %dopar% { 
    Z=1
    foreach(i = Y, .combine = c) %do% { 
        paste(j, i, Z, sep = "") 
    } 
}

【问题讨论】:

    标签: r loops foreach nested


    【解决方案1】:

    一般来说,如果您需要在foreach 循环中使用包,您应该使用“.packages”选项指定它。 foreach 包本身也是如此:

    library(doParallel)
    cl <- makePSOCKcluster(3)
    registerDoParallel(cl)
    foreach(j = X, .combine = c, .packages='foreach') %dopar% { 
        Z=1
        foreach(i = Y, .combine = c) %do% { 
            paste(j, i, Z, sep = "") 
        } 
    }
    

    当您意识到 PSOCK 集群甚至不知道 foreach 正在使用它时,这很有意义。它只是一个普通的 PSOCK 集群。

    请注意,可能没有必要指定所有必需的包以及一些并行后端。例如,使用 doMC,worker 继承所有当前加载的包。但是,最好指定它们以使代码更具可移植性。

    【讨论】:

    • 感谢史蒂夫,帮了大忙。
    • 这仅适用于 foreach 包不使用 parallel 作为其后端的情况,对吗?我没有这个问题。
    • @TrevorAlexander 在这种情况下,doMC 不需要它。但这是 Windows 上常见的问题来源,因为 doMC 示例不起作用,或者在使用 doSNOW 或 doMPI 的集群上运行时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多