如何使用 big.matrix 并行化我的 Sapply 函数? ( object of type 'S4' is not subsettable 错误)

How do I parallelize my Sapply function using a big.matrix? ( object of type 'S4' is not subsettable error)

首先 post/question 如果我做错了什么,我深表歉意,请告诉我,我会改正的。 我正在尝试使用 parsapply 来实现一个函数,该函数获取加权向量的平均值(只是使用平均值使其工作我希望能够做其他事情,但现在是平均值)但我一直收到此错误:

4 nodes produced errors; first error: object of type 'S4' is not subsettable

我正在使用一个名为 PUBG_stats 的 big.matrix 并尝试在第 8 列上实现它,并在下面的代码中使用一个名为 partition 的分区向量,如何将我的数据从 S4 转换为class 行得通还是有其他方法可以做到这一点?我经常使用 R,但我是并行新手。

library(parallel)
ncores<-detectCores()
cl <- makeCluster(ncores-1) 
clusterExport(cl, c("PUBG_stats","partition"))
system.time(parLapply(cl, 1:4, loopi, y=x1, partid=partid1))
parSapply(cl,1:5,function(x)(sum(PUBG_stats[,8][partition==1]*rand_vec(length(PUBG_stats[,8][partition==1]),N))/N)) 

ran_vec 只是一些创建权重的函数,1:5 在那里,因为我想重复它 1:r 次,无论 r 需要什么。

具有相同问题的可重现示例如下:

library(bigmemory)
library(parallel)
a<- as.big.matrix(rnorm(100000))
ncores <- detectCores()  
cl <- makeCluster(ncores) 
clusterExport(cl, c("a","sum","rnorm"))

parSapply(cl,1:5,function(x)(sum(a[,]*rnorm(1))))

stopcluster(cl)

错误:

    object of type 'S4' is not subsettable

正确的方法是将所有需要的包加载到worker上,你可以使用clusterEvalQ(),例如

library(bigmemory)
library(parallel)
a <- as.big.matrix(rnorm(100000))

## Setup workers
ncores <- 2
cl <- makeCluster(ncores)
clusterExport(cl, c("a","sum","rnorm"))
ignore <- clusterEvalQ(cl, { library(bigmemory) })

res <- parSapply(cl, 1:5, function(x) { sum(a[,]*rnorm(1)) })

stopcluster(cl)

但是,如果我们尝试 运行 上述代码,我们将得到:

> res <- parSapply(cl, 1:5, function(x) { sum(a[,]*rnorm(1)) })
Error in checkForRemoteErrors(val) : 
  5 nodes produced errors; first error: external pointer is not valid

这是因为classbig.matrix的对象不能导出到其他R进程(这里是workers)。这是这些对象如何工作的限制。据我所知,没有解决这个问题的方法——如果有的话,bigmatrix 的作者可以解决它。