ClusterFuture со снежными глыбами - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь получить длительный, неловкий параллельный анализ, используя снег и будущее, чтобы работать асинхронно.Но 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)

1 Ответ

1 голос
/ 04 июня 2019

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

Создано в 2019-06-04 пакетом Представления (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)

Создано в 2019-06-04 пакетом представ. (v0.3.0)

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

...