Как запустить обычный R-скрипт во всех узлах кластера / локального компьютера (параллельная обработка) - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 4 различные функции, которые в настоящее время работают последовательно, но это отнимает много времени. Моя локальная система имеет 4 ядра. Как запустить эти 4 функции во всех 4 ядрах параллельно. Пример: функция 1 в ядре 1, функция 2 в ядре 2 и т. Д. Примечание. Эти 4 функции являются независимыми.

Я попробовал приведенный ниже код из параллельной библиотеки, но не обнаружил существенной разницы во времени выполнения. Пожалуйста, помогите

library(parallel)
 cl <- makeCluster(4)

 clusterExport(cl, varlist=c("foo", "foo1", "foo2", "foo3"))
 cores <- seq_along(cl)

clusterApply(cl[cores], cores, function(core) {
   if (core == 1) {
     foo(5, 4)
   } else if (core == 2) {
     foo1(5, 3)
   } else if (core == 3) {
     foo2(5, 4)
   } else if (core == 4) {
     foo3(5, 2)
   }
 })

stopCluster(cl)

1 Ответ

0 голосов
/ 06 ноября 2018

Это можно сделать с помощью основного API Future, предоставляемого пакетом future (заявление об отказе: я автор).

Вот суть:

library(future)
plan(multisession)  ## all cores by default

## Launch functions asynchronously via futures
f0 <- future(foo(5, 4))
f1 <- future(foo1(5, 3))
f2 <- future(foo2(5, 4))
f3 <- future(foo3(5, 2))

## Wait for their values
v0 <- value(f0)
v1 <- value(f1)
v2 <- value(f2)
v3 <- value(f3)

Вместо явных вызовов future()/value() вы можете использовать так называемые будущие назначения для достижения того же:

library(future)
plan(multisession)  ## all cores by default

v0 %<-% foo(5, 4)
v1 %<-% foo1(5, 3)
v2 %<-% foo2(5, 4)
v3 %<-% foo3(5, 2)

## wait for, say, v2 only when you actually "need" the value
print(v2)
...