我正在尝试在R包中实现并行计算,该R包使用.C
函数从R调用C。集群的节点似乎无法访问动态库。我做了一个并行套接字集群,像这样:
cl <- makeCluster(2)
我想使用valgrad
在R包并行中从群集中每个节点上的R包评估一个名为clusterEvalQ
的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
的访问动态库的能力存在问题。我试图通过使用
clusterEvalQ(cl, library(glmm))
但这不能解决问题。
我可以使用foreach R包中的valgrad
函数在每个集群上评估foreach
,如下所示:
out <- foreach(1:no_cores) %dopar% {.C(C_valgrad, …)}
no_cores
是集群中的节点数。但是,此功能不允许在群集上的任何后续计算中访问valgrad
的评估结果。
我怎么能
(1)使valgrad
的评估结果可访问,以便以后在群集或
(2)使用clusterEvalQ
评估valgrad
吗?
答案 0 :(得分:1)
您必须加载外部库。但这不是通过library
调用完成的,而是通过dyn.load
完成的。
如果使用多个操作系统,以下两个功能很有用,它们使用内置变量.Platform$dynlib.ext
。
另请注意卸载功能。如果您开发C函数库,则将需要它。如果在测试前更改了C函数,则必须卸载动态库,然后重新加载(新版本)。
请参见编写R扩展,在doc文件夹中的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)
}