我有一个很大的数据。每个并行进程从中读取,处理数据并返回更小的data.table。我不希望将大DT复制到所有进程,但似乎%dopar%
包中的foreach
函数必须复制。
有没有办法让所有进程(在Windows中)共享对象?也就是说,使用foreach
以外的包。
示例代码
library(doParallel)
cluster = makeCluster(4)
registerDoParallel(cluster)
M = 1e4 # make this larger
dt = data.table(x = rep(LETTERS, M), y = rnorm(26*M))
res = foreach(trim = seq(0.6, 0.95, 0.05), .combine = rbind) %dopar% {
dt[, .(trimmean = mean(y, trim = trim)), by = x][, trim := trim]
}
(我对在data.table中更好的方法不感兴趣而不使用parallel。这只是为了表明子进程需要读取所有要处理的数据,但永远不要改变它)
答案 0 :(得分:3)
由于R不是多线程的,因此并行工作程序被实现为各种并行编程包中的进程。进程的一个特性是它们的内存受到保护而不受其他进程的影响,因此程序必须使用特殊机制在不同进程之间共享内存,例如内存映射文件。由于R不具备对任何此类机制的直接内置支持,因此包括诸如" bigmemory"已编写,可让您创建可在不同进程之间共享的对象。不幸的是," data.table"包不支持这样的机制,所以我认为没有办法做你想做的事。
请注意,内存可以是"只读"在Posix操作系统(例如Mac OS X和Linux)上的进程和分叉子进程之间共享,因此您可以使用" doMC"后端,但当然不能在Windows上运行。