如何让doSMP与plyr兼容?

4

这段代码是有效的:

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。有人找到了解决方法吗?

编辑:回应Andrie的问题,这里有进一步的说明:

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秒钟的时间。第二个函数会发出警告,表示没有注册并行后端,因此按顺序执行。第四个函数会出现我在原帖中提到的相同错误。

/编辑:更加好奇了:在我的 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的并行后端不是可以互换的。


1
基本问题在于plyr依赖于在do.ply函数的封闭中传递大量信息。默认情况下,这些数据不会被传递,并且需要对.export参数进行调整才能正常工作。仍然不确定如何在一般情况下解决这个问题。 - hadley
@hadley:看起来doMC包是唯一能与plyr无缝配合的包。 - Zach
有人成功了吗? - Suraj
@SFun28,我和 plyr 的开发者 Hadley 聊过了,他确认 plyr 只能使用 doMP 后端。抱歉。 - Zach
doMP是什么,你的意思是doMC吗? - user890739
@user890739 是的,应该是doMC。那是一个打字错误。 - Zach
3个回答

4
虽然@hadley已经回答了这个问题,但我想补充一点,我认为plyr现在可以与其他foreach并行后端一起使用。这里有一个链接,其中包含一个示例,展示了plyr与doSNOW一起使用的情况。

从我的阅读/实验中,该链接表明需要定义一个自定义的createCluster函数,而snow没有提供。不确定为什么clusterExport不能解决这个问题。有人能确认plyr现在是否可以与每个并行后端一起使用,而无需编写重新定义如何导出变量的自定义函数吗? - cboettig
链接中的示例对我来说无法工作。我遇到了同样的问题。 - MeloMCR

2

确认一下 @LeeZamparo 的答案,plyr 现在似乎可以与 snow 一起使用,至少在 Windows 7 上的 R 版本 2.15.0 上是如此。问题中最后一段代码可以工作,但会出现晦涩的警告:

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

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接