r - 我如何使 doSMP 与 plyr 一起很好地发挥作用?

标签 r parallel-processing plyr data-management

此代码有效:

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 和 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 的各种并行后端不可互换。

最佳答案

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

关于r - 我如何使 doSMP 与 plyr 一起很好地发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5559287/

相关文章:

r - 如何计算数据框中每行的分类变量(级别)的频率

sql - 在R中并行化SQL查询

r - 计算两个子组之间的统计检验的 ggplot2/plyr 方法是什么?

r - 同时使用 formattable 和 plotly

r - 如何在错误时暂停 R 脚本

r - 按包含元素列表的变量中的元素对数据框进行分组

parallel-processing - 并行创建稀疏矩阵

go - channel 已关闭,但所有 goroutine 都处于 sleep 状态 - 死锁

r - R 中的 min() 返回 NA 而不是 Inf

r - ddply 调用中的 prop.table