2014-09-01 3 views
3

Я выполняю оптимизацию кода R с помощью Rcpp и параллельных вычислений в Windows. У меня есть проблема с вызовом функции Rcpp в parLapply. Пример следующиеИспользование функции Rcpp в parLapply в Windows

Rcpp код (test.cpp)

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
NumericVector payoff(double strike, NumericVector data) { 
    return pmax(data - strike, 0); 
} 

R код

library(parallel) 
library(Rcpp) 

sourceCpp("test.cpp") 

strike_list <- as.list(seq(10, 100, by = 5)) 

data <- runif(10000) * 50 

# One core version 
strike_payoff <- lapply(strike_list, payoff, data) 

# Multiple cores version 
numWorkers <- detectCores() 
cl <- makeCluster(numWorkers, type = "PSOCK") 
clusterExport(cl = cl,varlist = "payoff") 
strike_payoff <- parLapply(cl, strike_list, payoff, data) 

Ошибка параллельной версии

Error in checkForRemoteErrors(val) : 
    8 nodes produced errors; first error: NULL value passed as symbol address 

Я знаю, что это проблема для Windows , поскольку mclapply хорошо работает на Linux, но у меня нет такой мощной машины Linux, как у Windows.

Любые идеи, как исправить это?

+0

Просьба уточнить: вы запускаете код на выигрышной машине, а сервер также является выигрышной машиной? – Roland

+0

У меня есть только локальная машина Windows. Нет сервера – kismsu

ответ

6

Вам необходимо запустить вызов sourceCpp() в каждом порожденном процессе или получить код. Прямо сейчас основной процесс имеет функцию, порожденные работники этого не делают.

Самый простой способ - создать пакет и загрузить его каждым рабочим процессом.

+0

Но sourceCpp() относительно медленный. Я не делал создание пакета. Считаете ли вы, что быстрее построить пакет и загрузить его каждому работнику? – kismsu

+0

Да, так работает строительство пакета. Вы только компилируете один раз. –

+0

Хорошо, спасибо. Стоит попробовать – kismsu

Смежные вопросы