ClusterFuture со снежными блоками

Я пытаюсь получить длительный, смущающий параллельный анализ, используя снег и будущее для асинхронного запуска. Но ClusterFuture блокирует, упрощенный код ниже. Есть ли способ предотвратить блокировку ClusterFuture? Или я просто делаю что-то не так? Запуск R версии 3.5.3 в 64-битной Windows (а со временем и в Linux).

спасибо Марк

пробовал просто лаппли со снегом, и просто фьючерс. ClusterFuture с parLapply работает очень хорошо, время выполнения точно такое, каким оно должно быть (в 8 раз быстрее). Но он блокируется, и мне бы очень хотелось, чтобы он вел себя как обычное будущее (и возвращал управление консоли).

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)

person Mark Sale    schedule 04.06.2019    source источник


Ответы (1)


В вашем коде фактическая параллельная рабочая нагрузка обрабатывается не 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)

Создано 4 июня 2019 г. с помощью пакета reprex (v0.3.0)

Итак, в настоящее время вы создаете одно будущее из результатов ваших параллельных вычислений. Вместо этого вы должны создать несколько фьючерсов, которые затем оцениваются параллельно:

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)

Создано 4 июня 2019 г. с помощью пакета reprex (v0.3.0)

Примечание. В соответствии с ?cluster предпочтительным методом создания ClusterFuture является future() или %<-% после регистрации подходящего (кластерного) плана для выполнения.

person Ralf Stubner    schedule 04.06.2019
comment
Отлично, спасибо, я потратил несколько дней, пытаясь понять это, спасибо - person Mark Sale; 04.06.2019
comment
Ральф, еще раз спасибо за ваш очень полезный ответ на мой предыдущий вопрос, я опубликовал новый вопрос о вложенных фьючерсах с кластером, любая помощь будет оценена. - person Mark Sale; 07.08.2019