【问题标题】:Using Rcpp function in parLapply on Windows在 Windows 上的 parLapply 中使用 Rcpp 函数
【发布时间】:2014-09-01 13:14:58
【问题描述】:

我正在使用 Rcpp 和 Windows 上的并行计算进行 R 代码优化。我在 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 机器。

有什么解决办法吗?

【问题讨论】:

  • 请澄清:您在win机器上运行代码,服务器也是win机器?
  • 我只有本地 Windows 机器。没有服务器

标签: r parallel-processing rcpp


【解决方案1】:

您需要在每个生成的进程中运行sourceCpp() 调用,否则将它们获取您的代码。现在主进程有这个功能,派生出来的工人没有。

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

【讨论】:

  • 但是 sourceCpp() 比较慢。我还没有完成包构建。您认为构建一次包并将其加载到每个工作人员会更快吗?
  • 是的,这就是构建包的工作方式。你只编译一次。
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
相关资源
最近更新 更多