2014-09-01 127 views
3

我正在Windows上使用Rcpp和并行计算进行R代码优化。我在调用parLapply中的Rcpp函数时遇到了麻烦。这个例子是继在Windows的parLapply中使用Rcpp函数

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上运行良好,但我没有像Windows那样强大的Linux机器。

任何想法如何解决它?

+0

请澄清一下:您在win机器上运行代码,服务器也是win机器? – Roland 2014-09-01 13:21:12

+0

我只有本地Windows机器。没有服务器 – kismsu 2014-09-01 13:26:30

回答

6

您需要在每个产生的进程中运行sourceCpp()调用,或者让他们获得您的代码。现在主流程有功能,产生的员工不会。

最简单的方法是通过构建一个包并让它由每个工作进程加载。

+0

但是sourceCpp()相对较慢。我没有完成软件包构建。你认为一次构建包并将其加载到每个工作者会更快吗? – kismsu 2014-09-01 13:34:46

+0

是的,这是如何建立一个包的作品。你只编译一次。 – 2014-09-01 13:36:17

+0

好的,谢谢。值得尝试 – kismsu 2014-09-01 13:40:23