gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:42:32 30 4
gpt4 key购买 nike

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

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com