【问题标题】:Effective consecutive access to complete file-backed big.matrix in Rcpp?有效连续访问 Rcpp 中完整的文件支持的 big.matrix?
【发布时间】:2017-11-09 15:29:25
【问题描述】:

我目前正在尝试找到一种允许连续函数调用的实现,其中每次调用都需要访问一个大矩阵的每个元素(最多 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 元素会导致删除第一个缓存的元素,但在连续的函数调用中,恰恰需要这些 big.matrix 的“第一个”元素? 如果“是”,是否有更好的(提高性能)方法来访问循环中的元素或删除缓存的元素?

非常感谢您的帮助!

【问题讨论】:

    标签: r rcpp r-bigmemory


    【解决方案1】:

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

    这基本上告诉您总是逐列访问,而不是逐行访问,以便访问连续内存中的数据(“访问的局部性”)。

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

    PS:你不需要传递n_rown_col。您可以通过xpMat-&gt;nrow()xpMat-&gt;ncol()mat.nrow()mat.ncol() 获得它们。

    【讨论】:

    • 好提示!速度提高了一点,但不幸的是我发现瓶颈是从硬盘读取数据。因此,从编码的角度来看,似乎没有什么可以改进的。
    • 这个数据只有7GB。如果您有超过 7GB 或 RAM 可用,阅读速度应该很快,尤其是第二次、第三次等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2023-03-04
    • 2014-01-18
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多