【发布时间】: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