【发布时间】:2015-05-22 12:07:03
【问题描述】:
以下代码在 Windows 和 Ubuntu 平台上产生不同的结果。我理解这是因为处理并行处理的方法不同。
总结:
我不能 insert / rbind 在 Linux 上并行处理数据(mclapply,mcmapply),而 我可以在 Windows 上完成 .
感谢@Hong Ooi 指出
mclapply不能在Windows 上并行工作,但以下问题仍然有效。
当然,同一个data.frame没有多次插入,每次插入都在单独的data.frame中执行。
library(R6)
library(parallel)
# storage objects generator
cl <- R6Class(
classname = "cl",
public = list(
data = data.frame(NULL),
initialize = function() invisible(self),
insert = function(x) self$data <- rbind(self$data, x)
)
)
N <- 4L # number of entities
i <- setNames(seq_len(N),paste0("n",seq_len(N)))
# random data.frames
set.seed(1)
ldt <- lapply(i, function(i) data.frame(replicate(sample(3:10,1),sample(letters,1e5,rep=TRUE))))
# entity storage
lcl1 <- lapply(i, function(i) cl$new())
lcl2 <- lapply(i, function(i) cl$new())
lcl3 <- lapply(i, function(i) cl$new())
# insert data
invisible({
mclapply(names(i), FUN = function(n) lcl1[[n]]$insert(ldt[[n]]))
mcmapply(FUN = function(dt, cl) cl$insert(dt), ldt, lcl2, SIMPLIFY=FALSE)
lapply(names(i), FUN = function(n) lcl3[[n]]$insert(ldt[[n]]))
})
### Windows
sapply(lcl1, function(cl) nrow(cl$data)) # mclapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
sapply(lcl2, function(cl) nrow(cl$data)) # mcmapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
sapply(lcl3, function(cl) nrow(cl$data)) # lapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
### Unix
sapply(lcl1, function(cl) nrow(cl$data)) # mclapply
#n1 n2 n3 n4
# 0 0 0 0
sapply(lcl2, function(cl) nrow(cl$data)) # mcmapply
#n1 n2 n3 n4
# 0 0 0 0
sapply(lcl3, function(cl) nrow(cl$data)) # lapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
还有问题:
如何在 Linux 平台上实现 rbind 到单独的 data.frames 中?
附:在我的情况下,像SQLite 这样的内存外存储不能被视为解决方案。
【问题讨论】:
-
您确实意识到 mclapply 实际上并没有在 Windows 上并行运行,对吧?
-
一个提示是查看
data.table包。我知道我的提示不能直接回答您的问题,但仍可能有助于提高性能。data.table包比基本R的data.frames 包更适合大型数据集(GB 范围)。 -
@RichardErickson 这是data.table,我翻译成data.frame只是为了提问;)
-
@RichardErickson,Jan 是
data.table包及其不同扩展的主要开发者之一... -
@DavidArenburg 肯定不是 main 开发者之一,我刚刚推送了几个小提交,你应该试试 :)
标签: r parallel-processing parallel-foreach r6 rparallel