мне все еще нужно makeCluster, если я уже делаю registerDoParallel (cl)

Чтение виньетки для doparallel.

Являются ли следующие два блока кода одним и тем же?

library(doparallel)
  no_cores <- 8
  cl <- makeCluster(no_cores) 
  registerDoParallel(cl)
pieces <- foreach(i = seq_len(length(pieces))) %dopar% { # do stuff}

Выше точно так же, как это:

library(doparallel)
  registerDoParallel(cores = 8)
pieces <- foreach(i = seq_len(length(pieces))) %dopar% { # do stuff}

Должен ли я makeCluster() использовать doparallel, если я хочу использовать несколько ядер? или достаточно одной строки registerDoParallel(cores = 8)


person Doug Fir    schedule 20.08.2017    source источник
comment
Из того, что я могу сказать, может быть даже лучше НЕ использовать makeCluster(), поскольку использование только registerDoParallel() автоматически импортирует все необходимые функции и объекты в кластер без необходимости делать это вручную.   -  person Doug Fir    schedule 20.08.2017
comment
Возможный дубликат stackoverflow.com/q/28829300/6103040 и stackoverflow.com/q/28989855/6103040   -  person F. Privé    schedule 20.08.2017
comment
Что бы это ни стоило, первая строка единственного примера до ?registerDoParallel — это cl <- makePSOCKcluster(2).   -  person lmo    schedule 20.08.2017


Ответы (1)


На компьютере с Windows эти два примера практически эквивалентны. Единственное отличие состоит в том, что в первом примере используется явный объект кластера, а во втором — неявный объект кластера, который создается при выполнении registerDoParallel. Производительность двух примеров должна быть одинаковой.

На компьютере Mac или Linux в первом примере используется бэкенд, производный от snow (точно такой же, как и на компьютере с Windows), в конечном итоге использующий clusterApplyLB для выполнения параллельных вычислений. Во втором примере используется бэкенд, производный от multicore (который никогда не был доступен в Windows), в конечном итоге использующий mclapply для выполнения параллельных вычислений, которые, вероятно, будут несколько более эффективными, чем в первом примере.

person Steve Weston    schedule 21.08.2017
comment
Спасибо. После некоторого тестирования и проб/ошибок (я на Mac локально, но использую удаленный сервер) я обнаружил, что первый вариант дает мне ошибки выделения памяти, а второй вариант - нет. - person Doug Fir; 21.08.2017
comment
@DougFir Это неудивительно, потому что использование mclapply fork для запуска рабочих часто позволяет им более эффективно использовать память вашей машины. - person Steve Weston; 21.08.2017
comment
Не уверен, связано это или нет, но запустил блок dopar, который работает прекрасно, но оставляет затяжную проблему с памятью. Пробовал закрывать соединения вручную, но безуспешно. Мне все время приходится перезапускать сеанс r выделять память даже после удаления больших объектов и закрытия соединений"> stackoverflow.com/questions/45859005/ - person Doug Fir; 24.08.2017