r - 交互式 R 中的异步命令调度

标签 r asynchronous parallel-processing

我想知道这是否可以(可能不是)使用 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使用 describeattach.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/

    相关文章:

    parallel-processing - 如何强制某组目标始终按顺序运行?

    c - 为什么从 OpenMP 程序中得到不正确的结果?

    R - dbplyr - `lang_name()` 已弃用

    javascript - Shiny 应用程序可以在不访问服务器的情况下响应控件吗?

    Perl - Win32 - 如何从另一个进程进行文件句柄的非阻塞读取?

    java - 并行流和核心数

    r - 将带有日期的列转换为 R 中的行

    python - Python 命令 requests.post() 的 R 对应项是什么?

    javascript - 如何从 for 语句中的异步回调获取结果

    javascript - 收到 AJAX 内容时 $.each 的下一次迭代