Ошибка parSapply. Функция работает без Parallel

У меня есть рабочая функция, но при работе на AWS EC2 она использует только одно ядро, и я хочу преобразовать ее в параллельную.

Исходная проблема решена (без Parallel) по адресу: применить - проверить несколько условий перед перемещением строк

Я установил Intel MKL на сервер AWS EC2, и он по-прежнему работает с использованием только одного ядра. Я попытался отредактировать код, как показано ниже.

PipSize <- 0.00886

myfun <- function(x, df = EURUSD, Limit = PipSize, StopLoss = PipSize) {

  highComp <- which(df$High - df$Open[x] > Limit)
  highCompMin <- if (length(highComp) == 0) 0 else min(highComp)
  lowComp <- which(df$Open[x] - df$Low > StopLoss)
  lowCompMin <- if (length(lowComp) == 0) 0 else min(lowComp)

  if (highCompMin == 0 & lowCompMin == 0) {
    result <<- c(Limit = NA, Open = df$Open[x])
  } else if (highCompMin <= lowCompMin) {
    result <<- c(Limit = 1, Open = df$Open[x])
  } else {
    result <<- c(Limit= 0, Open = df$Open[x])
  }

  return(result)

}

t(sapply(1:10, function(x) myfun(x, df = EURUSD, Limit = PipSize, StopLoss = PipSize)))

Дополнительный параллельный код, возвращающий ошибку

library("parallel")
library("doParallel")
n.cores <- detectCores()
cl <- makeCluster(n.cores, type = "FORK")
clusterExport(cl, "myfun")
parSapply(cl, 1:10, myfun)

stopCluster(clust)

Ошибка:

Error in checkForRemoteErrors(val) : 
  8 nodes produced errors; first error: can only subtract from "POSIXt" objects

Глава EURUSD:

                  Date    Open    High     Low   Close
1  2016-01-03 17:00:00 1.08701 1.08713 1.08701 1.08713
2  2016-01-03 17:01:00 1.08712 1.08712 1.08712 1.08712
3  2016-01-03 17:02:00 1.08708 1.08722 1.08708 1.08722
4  2016-01-03 17:03:00 1.08717 1.08723 1.08717 1.08723
5  2016-01-03 17:04:00 1.08718 1.08718 1.08711 1.08711
6  2016-01-03 17:05:00 1.08703 1.08716 1.08701 1.08712
7  2016-01-03 17:06:00 1.08721 1.08721 1.08710 1.08710
8  2016-01-03 17:07:00 1.08712 1.08715 1.08712 1.08712
9  2016-01-03 17:08:00 1.08711 1.08720 1.08711 1.08713
10 2016-01-03 17:09:00 1.08716 1.08723 1.08708 1.08708

Предполагаемый результат: Если (High-Open > limit), то вернуть 1, если (Open - Low > StopLoss) вернуть 0. Если ни то, ни другое, то сравнить ту же цену открытия с High и Low следующего периода. Когда возвращается 1 или 0, увеличьте Open на + 1 и повторите процесс.


108
1

Ответ:

Решено

Я не уверен, в чем была причина проблемы, но я повозился с кодом, и теперь он работает, и подумал, что это может принести пользу другим.

library("parallel")
library("doParallel")

n.cores <- detectCores()
cl <- makeCluster(n.cores, type = "FORK")
clusterExport(cl, "myfun")
t(parSapply(cl, i:j, function(x) myfun(x, df = EURUSD2, Limit = k, StopLoss = k)))
stopCluster(cl)

Я добавил аргументы в часть myfun parSapply, а также изменил аргумент stopCluster.