带有雪块的 ClusterFuture

ClusterFuture with snow blocks

我正在尝试使用 snow 和 future 对 运行 进行异步的长时间 运行ning,令人尴尬的并行分析。但是,ClusterFuture 是阻塞的,下面简化了代码。有没有办法让 ClusterFuture 不阻塞?或者我只是做错了什么? 运行 64 位 Windows 上的 R 版本 3.5.3(最终也会在 Linux 上)。

谢谢 马克

只尝试 lapply 下雪,还有未来。带有 parLapply 的 ClusterFuture 工作得非常好,执行时间正是它应该的(快 8 倍)。但是,它会阻塞,我真的希望它表现得像一个普通的未来(并且 return 控制控制台)。

rm(list=ls())
RunNM2 <- function(index){
  Sys.sleep(4)
  return(index)
}
library(tictoc)
library(future)
library(snow)
cl <- future::makeClusterPSOCK(rep("localhost",8),makeNode =         
 makeNodePSOCK)
plan(cluster, workers = cl)
tic("cluster")
res.1 <- ClusterFuture(parLapply(cl,1:8,RunNM2),worker=cl )
##blocks here
res <- value(res.1)
toc()
stopCluster(cl)
rm(cl)

在您的代码中,实际的并行工作负载不是由 future 处理,而是由 snow::parLapply 处理。您可以在下面的示例中看到这一点,其中我使用 parallel 而不是 snow,对于简单的 PSOCK 集群,我认为它已被弃用:

RunNM2 <- function(index){
    Sys.sleep(4)
    return(index)
}
library(tictoc)
library(parallel)
cl <- makePSOCKcluster(rep("localhost",8))
tic("cluster")
res <- parLapply(cl,1:8,RunNM2)
toc()
#> cluster: 4.015 sec elapsed
stopCluster(cl)
rm(cl)

reprex package (v0.3.0)

于 2019-06-04 创建

因此,目前您正在根据并行计算的结果创建一个 未来。相反,您应该创建多个期货,然后并行评估它们:

RunNM2 <- function(index){
    Sys.sleep(4)
    return(index)
}
library(tictoc)
library(future)
cl <- makeClusterPSOCK(rep("localhost",8))
plan(cluster, workers = cl)
tic("cluster")
res.1 <- lapply(1:8, function(index) future(RunNM2(index)))
res <- values(res.1)
# blocks here
toc()
#> cluster: 4.66 sec elapsed
parallel::stopCluster(cl)
rm(cl)

reprex package (v0.3.0)

于 2019-06-04 创建

注意:根据 ?cluster 创建 ClusterFuture 的首选方法是 future()%<-% 在注册合适的(集群)执行计划后。