Как сделать так, чтобы doSMP хорошо играл с plyr? - PullRequest
4 голосов
/ 06 апреля 2011

Этот код работает:

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 и curiouser: На моем 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 не являются взаимозаменяемыми.

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Хотя @hadley хорошо ответил на этот вопрос, я хочу добавить, что, по-моему, plyr теперь работает с другими параллельными бэкэндами foreach.Вот ссылка на запись в блоге, содержащую пример, где plyr используется вместе с doSNOW:

2 голосов
/ 05 января 2013

Просто чтобы подтвердить ответ @ 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 голос
/ 13 апреля 2011

Оказывается, plyr работает только с doMC , но разработчик работает над этим.

...