我正在尝试在一个R包中实现并行计算,该包使用.C
函数从R调用C。集群的节点似乎不能访问动态库。我做了一个并行socket集群,如下所示:
cl <- makeCluster(2)
我想使用R包parallel中的clusterEvalQ
在集群中的每个节点上评估R包中名为valgrad
的C函数。但是,我的代码产生了一个错误。我编译了我的包,但是当我运行
out <- clusterEvalQ(cl, cresults <- .C(C_valgrad, …))
其中,…
表示C函数valgrad
中的参数。我得到了这个错误:
Error in checkForRemoteErrors(lapply(cl, recvResult)) :
2 nodes produced errors; first error: object 'C_valgrad' not found
我怀疑clusterEvalQ
访问动态库的能力有问题。我尝试通过使用以下命令将glmm包加载到集群中来修复此问题
clusterEvalQ(cl, library(glmm))
但这并没有解决问题。
我可以使用foreach R包中的foreach
函数评估每个集群上的valgrad
,如下所示:
out <- foreach(1:no_cores) %dopar% {.C(C_valgrad, …)}
no_cores
是集群中的节点数。但是,此函数不允许在集群的任何后续计算中访问valgrad
的任何计算结果。
我怎么才能
(1)使valgrad
的评估结果可供集群上的后续计算使用,或者
(2)使用clusterEvalQ
对valgrad
进行评估
发布于 2018-10-30 06:09:09
您必须加载外部库。但这不是通过library
调用完成的,而是通过dyn.load
完成的。
以下两个函数非常有用如果您使用多个操作系统,它们使用内置变量.Platform$dynlib.ext
。
还要注意unload函数。如果您开发一个C函数库,您将需要它。如果您在测试之前更改了一个C函数,则必须卸载动态库,然后重新加载(新版本)。
请参阅编写R Extensions,文件R-exts.pdf,位于文档文件夹的第5节或CRAN上。
dynLoad <- function(dynlib){
dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
dyn.load(dynlib)
}
dynUnload <- function(dynlib){
dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
dyn.unload(dynlib)
}
https://stackoverflow.com/questions/53054331
复制相似问题