R - Как распараллелить цикл, который делает симуляции Монте-Карло? - PullRequest
1 голос
/ 09 января 2012

Я пытаюсь понять, как распараллелить некоторый код из «интеллектуального анализа данных с R - обучением с использованием примеров», чтобы он быстрее выполнялся на моем MacBook Pro. Конкретный код вопроса ниже. Код в основном использует одни и те же данные (DS) и применяет шесть разных учащихся (например, svm, nnet для регрессии и классификации и т. Д.) С небольшим количеством вариантов.

Полный код: ЗДЕСЬ (в нижней части, в разделе «Оценка и выбор модели»).

for(td in TODO) {
  assign(td,
     experimentalComparison(
       DSs,         
       c(
         do.call('variants',
                 c(list('singleModel',learner=td),VARS[[td]],
                   varsRootName=paste('single',td,sep='.'))),
         do.call('variants',
                 c(list('slide',learner=td,
                        relearn.step=c(60,120)),
                   VARS[[td]],
                   varsRootName=paste('slide',td,sep='.'))),
         do.call('variants',
                 c(list('grow',learner=td,
                        relearn.step=c(60,120)),
                   VARS[[td]],
                   varsRootName=paste('grow',td,sep='.')))
         ),
        MCsetts)
     )
  # save the results
  save(list=td,file=paste(td,'Rdata',sep='.'))
}

Большая часть информации по распараллеливанию, которую я нахожу, кажется, более применима к таким вещам, как «применить», где одна и та же функция применяется к различным подмножествам данных. То, что делает этот код, наоборот - разные функции применяют одни и те же данные.

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

Выполнение за одну итерацию занимает чуть более 2 часов на моем macbook, где только 2 ядра, кажется, что-то делают (два других просто бездействуют). Фактический код по ссылке установлен на 20 итераций ... Было бы здорово использовать мои бездействующие ядра, чтобы уменьшить это

1 Ответ

2 голосов
/ 10 января 2012

В непараллельном случае передача функций в цикл lapply проста.

lapply(c(mean, sum), function(f) f(1:5))

Несколько различных систем для параллельного программирования с R. В следующем примере используется snow.

library(snow)
cl <- makeCluster(c("localhost","localhost"), type = "SOCK")
clusterApply(cl, c(mean, sum), function(f) f(1:5))
stopCluster(cl)

Вы должны получить один и тот же ответ в каждом случае!

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