如何解决如何使用big.matrix并行化Sapply函数? “ S4”类型的对象不是子集错误
第一个帖子/问题,如果我做错了,那么抱歉,请让我知道并且不满意。 我正在尝试使用parsapply实现一个获取加权矢量均值的函数(只是使用均值使其工作,我希望能够做其他事情,但现在是均值),但是我一直收到此错误: / p>
4 nodes produced errors; first error: object of type 'S4' is not subsettable
我正在使用一个名为PUBG_stats的big.matrix并尝试在第8列上实现它,并在下面的代码中实现一个名为partition的分区向量,如何将我的数据从S4转换为有效的类或以其他方式实现去做这个?我已经很好地使用了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在那里,我想在需要r时重复1:r次。
具有相同问题的可复制示例如下:
library(bigmemory)
library(parallel)
a<- as.big.matrix(rnorm(100000))
ncores <- detectCores()
cl <- makeCluster(ncores)
clusterExport(cl,c("a","sum","rnorm"))
parSapply(cl,function(x)(sum(a[,]*rnorm(1))))
stopcluster(cl)
错误:
object of type 'S4' is not subsettable
解决方法
正确的方法是将所有需要的软件包也加载到工作程序上,这可以通过使用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,]*rnorm(1)) })
Error in checkForRemoteErrors(val) :
5 nodes produced errors; first error: external pointer is not valid
这是因为无法将类big.matrix
的对象导出到其他R进程(此处为worker)。那是这些对象如何工作的限制。据我所知,还没有解决方案-如果有的话, bigmatrix 的作者可以解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。