我正在尝试使用data.table
包和plyr
在R中进行一些并行计算,我会遇到意外行为。我正在使用Windows 7.
我创建了以下函数,使用data.table
t_dt_test <- function(x){
#creates a 1-d frequency table for x
dt <- data.table(x)
dt[, j = list(freq = .N), by = x]
}
创建一些测试数据
test <- list(letters[1:3],letters[1:3],letters[1:3])
使用llply
.parallel = FALSE
可以正常使用
llply(test, t_dt_test, .parallel = FALSE)
[[1]]
x freq
1: a 1
2: b 1
3: c 1
如果我尝试平行购买
library(doParallel)
nodes <- detectCores()
cl <-makeCluster(nodes)
llply(test, t_dt_test, .parallel = TRUE ,.paropts = list( .packages = 'data.table'))
返回此
Error in do.ply(i) : task 1 failed - "invalid subscript type 'list'"
似乎[.data.table
没有像我期望的那样传递给节点。
我尝试将功能更改为
t_dt_test <- function(x){
#creates a 1-d frequency table for x
dt <- data.table(x)
data.table:::`[.data.table`(x = dt, j = list(freq = .N), by = x)
}
但仍然会出现同样的错误。
此处提出了类似的问题:Strange environment behavior in parallel plyr但没有得到答案
有什么建议吗?
答案 0 :(得分:1)
只需要进行非常少量的额外工作,您就可以使用foreach
包对其进行并列化。
试试这个:
library(data.table)
t_dt_test <- function(x){
dt <- data.table(x)
dt[, j = list(freq = .N), by = x]
}
test <- list(letters[1:3],letters[1:3],letters[1:3])
首先在顺序计算模式下使用foreach()
,以确保您具有正确的语法。由于foreach()
循环负责拆分和合并,因此不再使用llply()
:
library(foreach)
foreach(i = seq_along(test), .combine = c) %do% {
list(
t_dt_test(test[[i]])
)
}
要同时运行此功能,您只需将%do%
更改为%dopar
,并记住将data.table
添加到包列表中:
library(doParallel)
registerDoParallel(detectCores())
foreach(i = seq_along(test), .combine = c, .packages = "data.table") %dopar% {
list(
t_dt_test(test[[i]])
)
}
结果如预期:
[[1]]
x freq
1: a 1
2: b 1
3: c 1
[[2]]
x freq
1: a 1
2: b 1
3: c 1
[[3]]
x freq
1: a 1
2: b 1
3: c 1