【问题标题】:Plyr, doMC and global variablesPlyr、doMC 和全局变量
【发布时间】:2014-09-09 09:55:14
【问题描述】:

我使用R (3.1) 和plyrdoMC 作为并行后端(据我所知,这是唯一可以与plyr 一起使用的并行后端)

我的问题是如何从工作线程中写入全局变量。我有这个(非常人为的)例子:

library(doMC)
library(plyr)
registerDoMC(cores=2)

result1 = data.frame(id=c(1:3), a=NA)
result2 = data.frame(id=c(1:3), b=NA)

f = function(x){
    result1[ result1$id==x$id, "a"] <<- x$a
    result2[ result2$id==x$id, "b"] <<- x$b
}

data = data.frame(id=c(1:3), a=c(4:6), b=c(7:9))
a_ply(data, .margins=1, .fun=f, .parallel=T)

因为我想填充 2 个数据框,所以我不能使用 aaplyadply。该示例完成了它应该对parallel=FALSE 执行的操作。当我并行执行时,结果 data.frames 保持为空。我知道我必须将全局变量导出给工作人员,我尝试使用 .paropts=list(.export=c("result1", "result2")) 但这无济于事....

有人知道如何将全局变量导出到doMC 工人吗?或者是否有另一种解决方案可以在并行环境中填充两个 data.frames(没有plyr 的mazbe?)

【问题讨论】:

  • OT: library(doParallel);registerDoParallel(2) 也适用于 plyr。以及所有其他并行后端(doMPI、doSNOW)。
  • no...doMC 导出 plyr 需要的所有参数。请参阅@hadley 对此问题的评论:stackoverflow.com/questions/5559287/…
  • 三年前 ;)
  • 嗯......但是。 doParallel 不适用于我的 Ubuntu 64 位系统。

标签: r parallel-processing plyr domc


【解决方案1】:

您不能从并行工作人员修改全局对象。这就是您需要导出 data.frames 的原因 - 工作人员无法访问全球环境,他们只更改导出的 copy

您需要重写您的函数以返回某种值,稍后您可以使用它来填充 data.frame。

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多