используйте doSNOW, чтобы ускорить явный цикл в R - PullRequest
1 голос
/ 18 декабря 2010

Компьютер, который я использовал в офисе, был недавно обновлен до четырехъядерного, что является для меня благословением, поскольку иногда мне нужно сделать несколько явных циклов, используя R, результаты которых основаны на некоторых логических правилах, которые Я не могу понять, как это сделать, кроме явного цикла.

Для некоторой справочной информации иногда у меня есть около 10000-20000 строк, которые мне нужно посмотреть на 2 столбца, и основывать их значения и некоторые логические правила, чтобы сгенерировать значение для нового столбца.

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

library(doSNOW)
# rm(list=ls())

cl<-makeCluster(2) # I have two cores
registerDoSNOW(cl)

table <- data.frame(a=rnorm(1000),b=rnorm(1000))

process <- function(table)
              {for (loop in (1:nrow(table)))
                   {table[loop,"c"] <- with(table[loop,], a*b)
                    assign("table",table,envir=.GlobalEnv)
                   }
              }


system.time(process(table))

system.time(foreach(j=1:2 ) %dopar% process(table))

stopCluster(cl)

Я использую нетбук с процессором ATOM внутри, чтобы попробовать это, но результат странный:

system.time(process(table))
user  system elapsed 
2.336   0.028   2.308 

system.time(foreach(j=1:2 ) %dopar% process(table))
user  system elapsed 
0.160   0.032   3.646 

После использования doSNOW время, необходимое для получения результата, даже больше, чем без использования doSNOW, мне интересно, не в этом ли проблема моего нетбука ATOM или я что-то не так сделал в коде?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 18 декабря 2010

Насколько я могу судить, в вашем примере вы запускаете функцию один раз без snow и дважды с snow. Существует дополнительная нагрузка при параллельном запуске процессов, особенно при добавлении инфраструктуры foreach. Таким образом, среднее время выполнения меньше, чем если бы вы запускали их последовательно, но вы не можете ожидать того же общего времени при разделении.

Таким образом, вы ошибаетесь, говоря, что «результат даже дольше, чем без использования doSNOW». На самом деле, если запустить первый дважды, это займет почти вдвое больше времени. Так что snow действительно улучшил производительность.

Это справедливое сравнение:

system.time(for(i in 1:2) process(table))
system.time(foreach(j=1:2 ) %dopar% process(table))

Подумайте об этом так: предположим, у вас есть два человека, каждый из которых может независимо выполнить задачу за 1 минуту. Предположим, что если один человек выполняет несколько задач, это приводит к дополнительным накладным расходам. Но если вы попросите их работать независимо, им понадобится немного больше времени, чтобы собрать результаты вместе. Если вы попросите одного человека выполнить две задачи, это займет 2 минуты. Если вы попросите каждого человека работать отдельно, то в общей сложности это займет чуть более 1 минуты, поскольку в конце ему нужно общаться.

2 голосов
/ 18 декабря 2010

Прежде всего, на одной машине лучше использовать многоядерный, чем снежный; он использует тот факт, что вместо сокетов могут использоваться каналы, также время, необходимое для разветвления, меньше, чем для запуска нового процесса.

Теперь, именно поэтому параллельная версия работала дольше на вашем нетбуке; Существует неизбежная временная стоимость перехода к параллельной оценке, и она может доминировать в выигрыше от нескольких потоков. С более длинными работами это время станет незначительным, и вы получите ускорение.

0 голосов
/ 04 апреля 2011

Частично причиной замедления может быть также тот факт, что вы, скорее всего, используете одноядерный процессор (если у вас нет более нового двухъядерного Atom).В этом случае вы запускаете R последовательно, как если бы вы не использовали функцию foreach (), но с некоторыми дополнительными издержками от процесса, который пытается работать параллельно.Я предлагаю попробовать его на том, что в вашем офисе, чтобы увидеть, что там происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...