3

我有一个大数据表。每个并行进程从中读取数据,处理数据并返回一个小得多的 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 中执行此操作的更好方法不感兴趣。这只是为了说明子进程需要读取所有要处理的数据,但永远不要更改它的情况)

4

1 回答 1

3

由于 R 不是多线程的,因此并行工作程序被实现为各种并行编程包中的进程。进程的特点之一是它们的内存不受其他进程的影响,因此程序必须使用特殊的机制在不同的进程之间共享内存,例如内存映射文件。由于 R 没有对任何此类机制的直接内置支持,因此编写了诸如“bigmemory”之类的包,允许您创建可以在不同进程之间共享的对象。不幸的是,“data.table”包不支持这种机制,所以我认为没有办法做你想做的事。

请注意,内存可以在 Posix 操作系统(例如 Mac OS X 和 Linux)上的进程和分叉子进程之间“只读”共享,因此您可以使用“doMC”后端做您想做的事情,但是当然,这在 Windows 上不起作用。

于 2016-03-06T15:05:06.643 回答