Элементарно-среднее из нескольких больших.матричные объекты в R
У меня есть 17 больших файлов.матричные объекты (dim 10985 x 52598, 4,3 ГБ каждый), из которых я хотел бы вычислить среднее значение по элементам. Результат можно хранить в другом большом.матрица (gcm.РЭС.outputM).
Biganalytics:: apply () не работает, так как маржа может быть установлена только на 1 или 2. Я попытался использовать 2 для петель, как показано здесь
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
}
}
, что займет около 1,5 минут на строку i и, таким образом, около 11 дней работы.
Есть ли у кого-нибудь идеи о том, как ускорить это расчет? Я использую 64x Windows10 машину с 16 ГБ оперативной памяти.
Спасибо!
1 ответ:
Вы можете использовать этот код Rcpp:
// [[Rcpp::depends(BH, bigmemory, RcppEigen)]] #include <bigmemory/MatrixAccessor.hpp> #include <RcppEigen.h> using namespace Eigen; using namespace Rcpp; // [[Rcpp::export]] void add_to(XPtr<BigMatrix> xptr_from, XPtr<BigMatrix> xptr_to) { Map<MatrixXd> bm_from((double *)xptr_from->matrix(), xptr_from->nrow(), xptr_from->ncol()); Map<MatrixXd> bm_to((double *)xptr_to->matrix(), xptr_to->nrow(), xptr_to->ncol()); bm_to += bm_from; } // [[Rcpp::export]] void div_by(XPtr<BigMatrix> xptr, double val) { Map<MatrixXd> bm((double *)xptr->matrix(), xptr->nrow(), xptr->ncol()); bm /= val; }
Тогда, если у вас есть список больших.матричные объекты одинакового размера можно сделать:
library(bigmemory) bm_list <- lapply(1:5, function(i) big.matrix(1000, 500, init = i)) res <- deepcopy(bm_list[[1]]) lapply(bm_list[-1], function(bm) add_to(bm@address, res@address)) res[1:5, 1:5] # verif div_by(res@address, length(bm_list)) res[1:5, 1:5] # verif