【问题标题】:How do I make doSMP play nicely with plyr?如何使 doSMP 与 plyr 很好地配合?
【发布时间】:2011-07-30 09:06:12
【问题描述】:

此代码有效:

library(plyr)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=FALSE) 

虽然此代码失败:

library(doSMP)
workers <- startWorkers(2)
registerDoSMP(workers)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE) 
stopWorkers(workers)

>Error in do.ply(i) : task 3 failed - "subscript out of bounds"
In addition: Warning messages:
1: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’

2: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’

我正在使用 R 2.1.12、plyr 1.4 和 doSMP 1.0-1。有没有人想办法解决这个问题?

编辑:为了回应安德烈,这里有一个进一步的说明:

system.time(ddply(x, .(V), function(df) Sys.sleep(1), .parallel=FALSE)) #1
system.time(ddply(x, .(V), function(df) Sys.sleep(1), .parallel=TRUE)) #2
library(doSMP)
workers <- startWorkers(2)
registerDoSMP(workers)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
system.time(ddply(x, .(V), function(df) Sys.sleep(1), .parallel=FALSE)) #3
system.time(ddply(x, .(V), function(df) Sys.sleep(1), .parallel=TRUE)) #4
stopWorkers(workers)

前三个功能有效,但它们都需要大约 3 秒。函数 #2 发出警告,表示没有注册并行后端,因此按顺序执行。函数 #4 给出了我在原始帖子中引用的相同错误。

/edit: curioser 和好奇者:在我的 mac 上,以下工作:

library(plyr)
library(doMC)
registerDoMC()
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE)

但这失败了:

library(plyr)
library(doSMP)
workers <- startWorkers(2)
registerDoSMP(workers)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE) 
stopWorkers(workers)

这也失败了:

library(plyr)
library(snow)
library(doSNOW)
cl <- makeCluster(2, type = "SOCK")
registerDoSNOW(cl)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE) 
stopCluster(cl)

所以我认为 foreach 的各种并行后端是不可互换的。

【问题讨论】:

  • 基本问题是 plyr 依赖于在 do.ply 函数的附件中传递的大量信息。默认情况下不会传递此数据,它需要调整 .export 参数才能工作。通常仍然不确定如何执行此操作。
  • @hadley: doMC 包似乎是唯一与 plyr 无缝协作的包。
  • 有人成功了吗?
  • @SFun28 我与 Hadley(plyr 开发人员)交谈,他确认 plyer 仅适用于 doMP 后端。对不起
  • 什么是doMP,你的意思是doMC吗?

标签: r parallel-processing plyr data-management


【解决方案1】:

原来是plyr only works with doMC,但开发人员正在努力。

【讨论】:

    【解决方案2】:

    虽然@hadley 已经很好地回答了这个问题,但我想补充一点,我认为 plyr 现在可以与其他 foreach 并行后端一起使用。这是一个博客条目的link,其中包含一个将 plyr 与 doSNOW 结合使用的示例:

    【讨论】:

    • 从我的阅读/实验中,该链接表明需要定义一个自定义的 createCluster 函数,该函数不是由雪提供的。不知道为什么 clusterExport 不能解决这个问题。有人可以确认 plyr 现在可以与每个并行后端一起使用,而无需编写自定义函数来重新定义它们如何导出变量吗?
    • 链接中的示例对我不起作用。我也遇到了同样的问题。
    【解决方案3】:

    只是为了确认@LeeZamparo 的回答,plyr 现在似乎可以与snow 一起使用,至少在带有 R 版本 2.15.0 的 Windows 7 上。问题中的最后一段代码有效,但带有神秘的警告:

    library(plyr)
    library(snow)
    library(doSNOW)
    cl <- makeCluster(2, type = "SOCK")
    registerDoSNOW(cl)
    
    x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
    
    library(microbenchmark)
    mb <- microbenchmark(
    
          PP <- ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE),
          NP <- ddply(x, .(V), function(df) sum(df$Z),.parallel=FALSE) 
                         )
    
    stopCluster(cl)
    

    神秘警告:

    > warnings()
    Warning messages:
    1: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...
    

    这不是很快,我想这是开销......

    > mb
    Unit: milliseconds
                                                                 expr
    1 NP <- ddply(x, .(V), function(df) sum(df$Z), .parallel = FALSE)
    2 PP <- ddply(x, .(V), function(df) sum(df$Z), .parallel = TRUE)
            min        lq    median        uq       max
    1  11.91518  15.74567  20.10944  23.30453  38.09237
    2 314.58008 336.81160 348.42421 358.57337 575.11220
    

    检查它是否给出了预期的结果

    > PP
      V V1
    1 X  4
    2 Y  6
    3 Z  5
    

    关于本次会议的更多详细信息:

    > sessionInfo()
    R version 2.15.0 (2012-03-30)
    Platform: i386-pc-mingw32/i386 (32-bit)
    
    locale:
    [1] LC_COLLATE=English_Australia.1252  LC_CTYPE=English_Australia.1252   
    [3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C                      
    [5] LC_TIME=English_Australia.1252    
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
    [1] microbenchmark_1.1-3 doSNOW_1.0.6         iterators_1.0.6     
    [4] foreach_1.4.0        plyr_1.7.1           snow_0.3-10          
    
    loaded via a namespace (and not attached):
    [1] codetools_0.2-8 compiler_2.15.0 tools_2.15.0
    

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 2015-05-27
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多