Вывод параллельных вычислений в R на Windows - PullRequest
0 голосов
/ 03 февраля 2020

Я хотел бы сделать несколько параллельных вычислений в R на Windows.

library(doSNOW)
library(foreach)
cl<-makeCluster(4)
registerDoSNOW(cl)

nn = seq(2,20, by=2)
nn2 = rep(-1,10)
vector.accessed.within.iteration = rep(0, 10)

y = foreach(i=1:10) %dopar% {

   print(paste0('i = ', i))
   nn2[i] = (nn[i])^2
   vector.accessed.within.iteration[i] = nn[i] + nn2[i]
   nn2[i]
} 

stopCluster(cl)

При запуске кода y возвращается в виде списка квадратов от 2 до 20, как и предполагалось. Однако ни вектор nn2, ни vector.accessed.within.iteration не изменяется в пределах foreach l oop. Кроме того, печать print(paste0('i = ', i)) не происходит.

Можно ли параллельно запускать итерации al oop на windows, одновременно отображая сообщения и изменяя переменные из глобальной среды?

1 Ответ

2 голосов
/ 03 февраля 2020

Можно ли параллельно запускать итерации al oop на windows при ... изменении переменных из глобальной среды?

Нет (*). Все значения, установленные внутри конструкции foreach() %dopar% { ... }, должны возвращаться в конце каждой итерации. Это дизайн и философия пакета foreach . См. «Пример 2: слегка сложный for-l oop» в сообщении в блоге «Распараллелить For-L oop, переписав его как вызов Lapply» от 2019-01-11 (заявление об отказе: Я автор) о том, как вернуть несколько значений.

(*) Существуют различные обходные пути, которые взаимодействуют с использованием других каналов, например, файловой системы. Однако такие решения следует использовать только в том случае, если все другие альтернативы были исчерпаны и потерпели неудачу. Я настоятельно рекомендую такие альтернативные решения, потому что вы будете сталкиваться с другими типами проблем с приближенными. В вашем случае это вам определенно не нужно.

Возможно ли параллельно выполнять итерации al oop на windows, одновременно отображая сообщения ...?

Да, если вы используете doFuture foreach адаптер (отказ от ответственности: я автор). Когда вы используете это, вы получите доступ ко всем future framework, который включает ретрансляцию вывода, сообщений, предупреждений и других типов условий. Вы можете прочитать об этом в блоге 'future 1.9.0 - Выход из будущего' от 2018-07-23 (заявление об отказе: я автор).

> library(doFuture)
> registerDoFuture()  ## tell foreach to use the future framework

> ## Create a local cluster of two local workers
> plan(multisession, workers = 2L)

> library(foreach)
> y <- foreach(x = 1:3) %dopar% {
    cat(paste0("x = ", x, "\n"))
    sqrt(x)
  }
x = 1
x = 2
x = 3
> 
...