带有雪块的 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()
或 %<-%
在注册合适的(集群)执行计划后。
我正在尝试使用 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()
或 %<-%
在注册合适的(集群)执行计划后。