Я запускаю серию больших симуляций по сетке. Я выполняю моделирование по строкам и обнаружил, что мои функции выборки являются узким местом. Я попытался использовать библиотеки foreach и doMC для ускорения процесса, но обнаружил, что либо параллельный метод работает медленнее, либо мне не удалось закодировать функцию, которая правильно интерпретировалась бы с помощью foreach.
Глядя на некоторые другие сообщения, похоже, что мой подход с использованием foreach может быть ошибочным, поскольку количество выполняемых заданий значительно превышает количество доступных процессоров. Мне интересно, есть ли у кого-нибудь предложения о том, как лучше всего реализовать распараллеливание в моей ситуации. Мои симуляции обычно бывают двух типов. В первом я вычисляю матрицу, которая содержит интервал выборки (строки) для каждого элемента в строке сетки, которую я обрабатываю. Затем я пробую, используя runif (в реальных симуляциях мои строки содержат ~ 9000 ячеек, и я выполняю 10000 симуляций).
#number of simulations per element
n = 5
#Generate an example sampling interval.
m.int1 <- matrix ( seq ( 1, 20, 1 ), ncol=10, nrow=2 )
#Define a function to sample over the interval defined in m.int1
f.rand1 <- function(a) {
return ( runif ( n, a[1], a[2] ) )
}
#run the simulation with each columns corresponding to the row element and rows
#the simultions.
sim1 <- round( apply ( m.int1, 2, f.rand1 ) )
Во втором случае я пытаюсь сделать выборку из набора эмпирических распределений, индексированных по столбцам в матрице. Значение элемента grid-row соответствует столбцу для выборки.
#number of simulations per element
n = 5
#generate a vector represeting a row of grid values
v.int2 <- round(runif(10,1,3))
#define matrix of data that contains the distributions to be sampled.
m.samples<-cbind(rep(5,10),rep(4,10),rep(3,10))
f.sample <- function(a) {
return ( sample ( m.samples [ ,a], n, ) )
}
#Sample m.samples indexed by column number.
sim2<- sapply(v.int2,f.sample)
Во втором примере мне удалось использовать foreach () и % dopar% для параллельной работы, но моделирование заняло значительно больше времени, чем последовательный код. В случае с первым примером, приведенным выше, я не смог написать правильную функцию, которая использовала бы распараллеливание foreach. Я поместил код, который использовал во втором случае, просто чтобы продемонстрировать свое мышление, но теперь я понимаю, что мой подход требует слишком больших накладных расходов.
library(foreach)
library(doMC)
registerDoMC(2)
n = 5
#Sample m.samples indexed by column number using parallel method.
sim2.par <- foreach ( i = 1 : length ( v.int2 ),
.combine="cbind") %dopar% sample (
m.samples [ , v.int2 [i] ] , n )
Я был бы признателен за некоторые предложения по подходу (и немного кода!), Которые помогут мне эффективно использовать распараллеливание. Опять же, строки, которые я обрабатываю, обычно содержат около 9000 элементов, и мы проводим 10000 симуляций для каждого элемента. Таким образом, мои выходные матрицы моделирования обычно имеют порядок 10000 X 9000. Спасибо за вашу помощь.