Минималистский пример того, что я пытаюсь сделать:
dX_i <- rnorm(100, 0, 0.0002540362)
p_vec <- seq(0, 1, 0.25)
gamma_vec <- seq(1, 2, 0.25)
a_vec <- seq(2, 6, 1)
sigma_hat_vec <- c(0.03201636, 0.05771143, 0.07932116, 0.12262327, 0.15074560)
delta_j_vec <- c(0.0000005850109, 0.0000011700217, 0.0000017550326, 0.0000035100651, 0.0000052650977)
parameters <- expand.grid("p" = p_vec, "gamma" = gamma_vec, "a" = a_vec, "sigma_hat" = sigma_hat_vec, "delta_j" = delta_j_vec)
result <- sapply(1:nrow(parameters), function(x) {
tmp <- parameters[x,]
p <- tmp$p
a <- tmp$a
gamma <- tmp$gamma
sigma_hat <- tmp$sigma_hat
delta_j <- tmp$delta_j
B <- sum( (abs(dX_i)^p) * ( abs(dX_i) < gamma * a * sigma_hat * delta_j^(1/2) ))
return(B)
})
Цель: мне нужно вычислить B
для вектора dX, учитывая все комбинации p, a, gamma, sigma_hat, delta_j.
Однако в действительности сетка parameters
имеет ~ 600 тыс. Строк, а dX_i
имеет длину ~ 80 тыс. Более того, у меня есть список с ~ 1000 dX_i
. Поэтому я хочу сделать этот расчет максимально эффективным. Другие подходы, например, преобразование parameters
в data.table и запуск sapply
в этом data.table, похоже, не дают ускорения.
Я попытался распараллелить функцию (я ограничен запуском сценария на виртуальной Windows машине):
cl <- makePSOCKcluster(numCores)
num.iter <- 1:nrow(parameters)
parSapply(cl, num.iter, function(x, parameters, dX_i) {
tmp <- parameters[x,]
p <- tmp$p
a <- tmp$a
gamma <- tmp$gamma
sigma_hat <- tmp$sigma_hat
delta_j <- tmp$delta_j
sum( (abs(dX_i)^p) * ( abs(dX_i) < gamma * a * sigma_hat * delta_j^(1/2) ))
}, parameters, dX_i)
stopCluster(cl)
Хотя это дало мне ускорение, я все еще чувствую, что я ' на самом деле я не решаю эту проблему наиболее эффективным способом и буду признателен за любые предложения.