在Rcpp中有效连续访问完整的文件支持的big.matrix?

时间:2017-11-09 15:29:25

标签: r rcpp r-bigmemory

我目前正在尝试寻找一种允许连续函数调用的实现,其中每次调用都需要访问大矩阵的每个元素(最多1.5e9个双精度项)。

我使用bigmemory包与Rcpp一起处理矩阵以进行函数操作。

要更明确一点,请参阅以下代码。

C ++代码:

// [[Rcpp::export]]
double IterateBigMatrix2(SEXP pBigMat,int n_row, int n_col){
  XPtr<BigMatrix> xpMat(pBigMat);
  MatrixAccessor<double> mat(*xpMat);
  double sum = 0;
  for(int i=0;i<n_row;i++){
    for(int j=0;j<n_col;j++){
      sum += mat[j][i];
    }
  }
  return(sum);
}

R中的函数调用:

#Set up big.matrix
nrows <- 2e7
ncols <- 50
bkFile <- "bigmat.bk"
descFile <- "bigmatk.desc"
bigmat <- filebacked.big.matrix(nrow=nrows, ncol=ncols, type="double",
                                backingfile=bkFile, backingpath=".",
                                descriptorfile=descFile,
                                dimnames=c(NULL,NULL))
#Consecutive function calls
IterateBigMatrix2(bigmat@address,nrows,ncols)
IterateBigMatrix2(bigmat@address,nrows,ncols)

不幸的是,连续函数调用在某些时候因为增加n_rows而非常慢。 n_cols。

我的问题:

这是因为如果超过RAM,对big.matrix元素的访问会导致删除第一个缓存的元素,但是在连续的函数调用中,这些首先是“第一个&#39;需要big.matrix的元素吗? 如果&#39;是&#39;,是否有更好的(提高性能)方式来访问循环中的元素或删除缓存的元素?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

Big.matrix对象,作为标准R矩阵,按列存储。 这意味着矩阵实际上是一个长向量(由彼此连接的列组成)。

这基本上告诉您的是始终按列访问列,而不是逐行访问列,以便访问连续内存中的数据(&#34;访问的位置&#34;)。

所以,只需切换两个循环就可以了

PS:您不需要通过n_rown_col。您可以通过xpMat->nrow()xpMat->ncol()mat.nrow()mat.ncol()获取这些内容。