如何使用 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 的作者可以解决它。
首先 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 的作者可以解决它。