我想知道这是否可以(可能不是)使用 R
中的并行处理后端之一来完成。 .我尝试了一些谷歌搜索,但一无所获。
我目前遇到的一般问题:
load
理想情况下,我将能够从交互式 session 中发送命令,而不必等待它返回(这样我就可以在等待绘图渲染的同时做其他事情)。这是可能的,还是一厢情愿的情况?
最佳答案
为了扩展 Dirk 的回答,我建议您使用 parallel
中的“snow”API。包裹。 mcparallel
函数似乎非常适合此操作(如果您不使用 Windows),但由于使用了 fork
,因此它不能很好地执行图形操作。 . “snow” API 的问题在于它不正式支持异步操作。但是,如果您不介意使用非导出函数作弊,这很容易做到。如果您查看 clusterCall
的代码,你可以弄清楚如何异步提交任务:
> library(parallel)
> clusterCall
function (cl = NULL, fun, ...)
{
cl <- defaultCluster(cl)
for (i in seq_along(cl)) sendCall(cl[[i]], fun, list(...))
checkForRemoteErrors(lapply(cl, recvResult))
}
所以你只需使用
sendCall
提交任务,和recvResult
等待结果。这是使用 bigmemory
的示例包,正如德克所建议的那样。您可以使用诸如
big.matrix
之类的函数创建一个“大矩阵”。或 as.big.matrix
.您可能希望有效地做到这一点,但我只会转换矩阵 z
使用 as.big.matrix
:library(bigmemory)
big <- as.big.matrix(z)
现在我将创建一个集群并将每个工作人员连接到
big
使用 describe
和 attach.big.matrix
:cl <- makePSOCKcluster(2)
worker.init <- function(descr) {
library(bigmemory)
big <<- attach.big.matrix(descr)
X11() # use "quartz()" on a Mac; "windows()" on Windows
NULL
}
clusterCall(cl, worker.init, describe(big))
除了附加到大矩阵之外,这还会在每个 worker 上打开图形窗口。
调用
persp
在第一个集群工作器上,我们使用 sendCall
:parallel:::sendCall(cl[[1]], function() {persp(big[]); NULL}, list())
这几乎立即返回,尽管在情节出现之前可能需要一段时间。此时,您可以将任务提交给其他集群工作器,或者做一些完全不相关的事情。在向同一个工作人员提交另一个任务之前,请确保您阅读了结果:
r1 <- parallel:::recvResult(cl[[1]])
当然,这一切都非常容易出错,而且一点也不漂亮,但是您可以编写一些函数以使其更容易。请记住,诸如此类的非导出函数可能会随着 R 的任何新版本而改变。
请注意,通过对集群对象进行子集化,在特定工作人员或工作人员集上执行任务是完全可能且合法的。例如:
clusterEvalQ(cl[1], persp(big[]))
这会将任务发送给第一个 worker ,而其他人什么都不做。但当然,这是同步的,因此在此任务完成之前,您无法对其他集群工作程序执行任何操作。我知道异步发送任务的唯一方法是作弊。
关于r - 交互式 R 中的异步命令调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18819505/