mclappy:在多核机器上运行的lapply hack对特定的库(pdist)函数不起作用

时间:2015-07-17 10:25:13

标签: r parallel-processing

第一:我的问题的根源是" lapply"的并行处理实现的黑客攻击。 for Windows - 作者:Nathan VanHoudnos

http://edustatistics.org/nathanvan/2014/07/14/implementing-mclapply-on-windows/

我的目标是应用" pdist",距离函数来计算"距离"在两个矩阵之间。

原始代码工作得很好 - 但是当我尝试使用' pdist'时出现问题。图书馆功能。

我也确保了' pdist'函数名称包含在clusterExport()代码中。

我得到的错误是:

checkForRemoteErrors(val)出错: 4个节点产生错误;第一个错误:C符号名称" Rpdist"不在装载表

在这里重现了代码:

## Load packages 
require(parallel)
require(pdist)

# Define global variables 
A = rbind(c(3,40,1),c(24,13,2), c(90,8,1));
B = rbind(c(23,4,11),c(13,913,12), c(0.9,0.8,0.1));

## Step 1: Create a cluster of child processes 
cat("\n Step 1: Create a cluster of child processes...."); 
cl <- makeCluster(4)

## Step 2: Load the necessary R package(s)
## N.B. length(cl) is the number of child processes in the cluster 
cat("\n Step 2: Load the necessary R package(s)....");
par.setup <- parLapply (cl, 1:length(cl),
    function(xx) {
        require(pdist) 
})

## Step 3: Distribute the necessary R objects 
cat("\n Step 3: Distribute the necessary R objects....");
clusterExport (cl, c('A', 'B', 'pdist'))

## Step 4: Do the computation
cat("\n Step 4: Do the multi-core computation....\n");
par.Distance <- parLapply (cl, 1:4,
    function(xx) {
       as.matrix(pdist(A, B))            
    })

## Step 5: Remember to stop the cluster!
cat("\n Step 5: Stop the clusters....\n");
stopCluster(cl)

cat("\n Output: "); print(par.Distance);
cat("\n ----------------------------- \n");

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的示例对我有用,因此我怀疑工作人员无法在您的计算机上成功加载pdist包。 par.setup的值应为包含四个TRUE值的列表。如果没有,您需要解决该问题,可能是在加载.libPaths之前对工作人员执行pdist

此外,使用pdistclusterExport导出给工作人员毫无意义。如果您可以在工作人员上成功加载pdist软件包,则没有必要,因为它取决于pdist软件包中没有的代码,这是不够的。由clusterExport发送给工人。它只是将错误信息更改为您现在看到的信息。