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

最佳答案

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

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

07-24 09:38
查看更多