【发布时间】:2018-08-28 00:25:09
【问题描述】:
我有 17 个文件支持的 big.matrix 对象(尺寸为 10985 x 52598,每个 4.3GB),我想计算其中的元素平均值。结果可以存储在另一个 big.matrix (gcm.res.outputM) 中。
biganalytics::apply() 不起作用,因为 MARGIN 只能设置为 1 或 2。我尝试使用 2 个 for 循环,如下所示
gcm.res.outputM <- filebacked.big.matrix(10958, 52598, separated = FALSE, backingfile = "gcm.res.outputM.bin", backingpath = NULL, descriptorfile = "gcm.res.outputM.desc", binarydescriptor = FALSE)
for(i in 1:10958){
for(j in 1:52598){
t <- rbind(gcm.res.output1[i,j], gcm.res.output2[i,j],gcm.res.output3[i,j], gcm.res.output4[i,j],
gcm.res.output5[i,j], gcm.res.output6[i,j],gcm.res.output7[i,j], gcm.res.output8[i,j],
gcm.res.output9[i,j], gcm.res.output10[i,j],gcm.res.output11[i,j], gcm.res.output12[i,j],
gcm.res.output13[i,j], gcm.res.output14[i,j],gcm.res.output15[i,j], gcm.res.output16[i,j],
gcm.res.output17[i,j])
tM <- apply(t, 2, mean, na.rm = TRUE)
gcm.res.outputM[i,j] <- tM
}
}
每行 i 大约需要 1.5 分钟,因此运行大约 11 天。
有人对如何加快计算速度有任何想法吗?我正在使用具有 16GB RAM 的 64x Windows10 机器。
谢谢!
【问题讨论】:
-
看看这个winvector.github.io/Accumulation。使用
data.table包可能会有所帮助 -
有很多方法可以做到这一点。您可以在 Rcpp 中实现它,或者对所有矩阵的列块使用 R 函数,或者将矩阵一一相加。这些解决方案是在易于实施、速度有多快和使用多少内存之间进行权衡。你有多少内存?
-
感谢您的 cmets。 @F Privé,我有 16GB 的 RAM。使用 big.matrix 对象的优点是我不必将整个矩阵直接加载到 RAM 中。我能做的是在当时对整行值进行上述计算,从而摆脱第二个 for 循环。如果您有更多建议,我很乐意听到!
标签: r bigdata r-bigmemory