Распараллеливание не работает с пакетом foreach

Используя пакет foreach, я ожидал, что следующая строка будет запущена примерно через 10 секунд.

system.time(foreach (i=1:5, .combine='c') %do% {Sys.sleep(2);i})
   user  system elapsed 
  0.053   0.011  10.012 

и следующая строка будет запущена примерно через 2 секунды

system.time(foreach (i=1:5, .combine='c') %dopar% {Sys.sleep(2);i})
   user  system elapsed 
  0.069   0.017  10.019 

но это не работает.

Я на Mac OSX, моя машина имеет 16 процессоров, и в настоящее время ничего тяжелого не работает. Я не получаю никаких сообщений об ошибках или предупреждений.


person Remi.b    schedule 06.06.2015    source источник
comment
Вроде бы параллелить тут нечего. В вашем цикле for указано, что все пять циклов выполняются последовательно.   -  person Robert Harvey    schedule 07.06.2015
comment
Мне показалось, что я неправильно понял виньетку. Я думал, что использование %dopar% приведет к тому, что все, что находится в цикле foreach, будет выполняться параллельно для каждого значения i. В первом абзаце страницы 8 можно прочитать: To make any of the previous examples run in parallel, all you have to do is to replace %do% with %dopar%. В чем моя ошибка?   -  person Remi.b    schedule 07.06.2015
comment
Вы получили предупреждающее сообщение: последовательное выполнение %dopar%: параллельный бэкэнд не зарегистрирован?   -  person Steve Weston    schedule 08.06.2015


Ответы (1)


Вам необходимо зарегистрировать параллельный бэкэнд. Сделайте что-нибудь вроде

library(doParallel)
registerDoParallel(cores=4)
person user12912834    schedule 07.06.2015