R 并行共享内存对象 (windows)
R parallel shared memory object (windows)
我有一个大data.table。每个并行进程从中读取数据,处理数据和 returns 更小的 data.table。我不希望将大 DT 复制到所有进程,但似乎 foreach
包中的 %dopar%
函数必须复制。
有没有办法让所有进程共享对象(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 中不使用并行的更好方法不感兴趣。这只是为了说明子进程需要读取所有数据进行处理的情况,但永远不要更改它)
由于 R 不是多线程的,并行工作者在各种并行编程包中被实现为进程。进程的一个特点是它们的内存不受其他进程的影响,因此程序必须使用特殊的机制在不同的进程之间共享内存,例如内存映射文件。由于 R 没有对任何此类机制的直接内置支持,因此编写了诸如 "bigmemory" 之类的程序包,使您可以创建可在不同进程之间共享的对象。不幸的是,"data.table" 包不支持这种机制,所以我认为没有办法做你想做的事。
请注意,在 Posix 操作系统(例如 Mac OS X 和 Linux),所以你可以使用 "doMC" 后端做你想做的事,但这当然不适用于 Windows。
我有一个大data.table。每个并行进程从中读取数据,处理数据和 returns 更小的 data.table。我不希望将大 DT 复制到所有进程,但似乎 foreach
包中的 %dopar%
函数必须复制。
有没有办法让所有进程共享对象(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 中不使用并行的更好方法不感兴趣。这只是为了说明子进程需要读取所有数据进行处理的情况,但永远不要更改它)
由于 R 不是多线程的,并行工作者在各种并行编程包中被实现为进程。进程的一个特点是它们的内存不受其他进程的影响,因此程序必须使用特殊的机制在不同的进程之间共享内存,例如内存映射文件。由于 R 没有对任何此类机制的直接内置支持,因此编写了诸如 "bigmemory" 之类的程序包,使您可以创建可在不同进程之间共享的对象。不幸的是,"data.table" 包不支持这种机制,所以我认为没有办法做你想做的事。
请注意,在 Posix 操作系统(例如 Mac OS X 和 Linux),所以你可以使用 "doMC" 后端做你想做的事,但这当然不适用于 Windows。