我有一个很大的data.table。每个并行进程从它读取、处理数据并返回一个小得多的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中不使用并行的更好的方法并不感兴趣。这只是为了说明子进程需要读取要处理的所有数据,但从不更改)
发布于 2016-03-06 15:05:06
由于R不是多线程的,所以并行工作人员在各种并行编程包中被实现为进程。进程的一个特点是它们的内存不受其他进程的保护,因此程序必须使用特殊的机制在不同进程之间共享内存,例如内存映射文件。由于R对任何这样的机制都没有直接的内置支持,所以编写了诸如"bigmemory“之类的包,允许您创建可以在不同进程之间共享的对象。不幸的是,"data.table“包不支持这样的机制,所以我不认为有什么方法可以满足您的需要。
请注意,在Posix操作系统(如Mac和Linux)中,内存可以在进程和分叉子进程之间“只读”共享,因此您可以使用"doMC“后端来做您想做的事情,但是这当然不能在Windows上工作。
https://stackoverflow.com/questions/35778162
复制相似问题