Я пытаюсь понять, как распараллелить некоторый код из «интеллектуального анализа данных с помощью 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, чтобы код внутри выполнялся для нескольких учащихся одновременно, в отличие от параллельного выполнения кода внутри цикла, чтобы различные подходы к работе с окнами применялись параллельно для одного учащегося.
На моем MacBook выполнение одной итерации занимает чуть более 2 часов, где только 2 ядра, кажется, что-то делают (два других просто бездействуют). Фактический код из ссылки установлен на 20 итераций ... Было бы здорово использовать мои незанятые ядра, чтобы уменьшить это
variantsCMP <- cmpfun(variants)
, но для гораздо более быстрого ускорения лучше всего использовать скомпилированный язык. C ++ можно легко реализовать в R через пакетRcpp
. - person Sacha Epskamp   schedule 09.01.2012lapply(1:N, some_function)
, гдеN
- количество раз, которое вы хотите вычислитьsome_function
. В Unix / Linux вы можете заменитьlapply
наmclapply
из пакетаparallel
(при условии, что у вас более одного ядра). Если вы работаете в Windows, обратите внимание на пакетsnow
. - person Jason Morgan   schedule 10.01.2012