ParSapply ошибка. Функция работает без параллели - PullRequest
0 голосов
/ 09 июля 2019

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

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

Я установил 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. Если ни то, ни другое сравнить ту же цену открытия с максимумом и минимумом следующегопериод.Если возвращается 1 или 0, увеличьте значение Open на + 1 и повторите процесс.

1 Ответ

0 голосов
/ 10 июля 2019

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

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.

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