在 Rcpp 中有效连续访问完整的文件支持 big.matrix?
Effective consecutive access to complete file-backed big.matrix in Rcpp?
我目前正在尝试寻找允许连续函数调用的实现,其中每次调用都需要访问大矩阵的每个元素(最多 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 的这些 'first' 元素需要吗?
如果 'yes',是否有更好的(提高性能)方法来访问循环中的元素或删除缓存的元素?
非常感谢您的帮助!
Big.matrix 个对象,作为标准的 R 矩阵,按列存储。
这意味着矩阵实际上是一个长向量(由相互连接的列组成)。
这基本上告诉您的是始终逐列访问,而不是逐行访问,以便访问连续内存中的数据 ("locality of accesses")。
所以,只要切换你的两个循环就可以了。
PS:不需要传递n_row
和n_col
。您可以通过 xpMat->nrow()
和 xpMat->ncol()
或 mat.nrow()
和 mat.ncol()
.
获取它们
我目前正在尝试寻找允许连续函数调用的实现,其中每次调用都需要访问大矩阵的每个元素(最多 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 的这些 'first' 元素需要吗? 如果 'yes',是否有更好的(提高性能)方法来访问循环中的元素或删除缓存的元素?
非常感谢您的帮助!
Big.matrix 个对象,作为标准的 R 矩阵,按列存储。 这意味着矩阵实际上是一个长向量(由相互连接的列组成)。
这基本上告诉您的是始终逐列访问,而不是逐行访问,以便访问连续内存中的数据 ("locality of accesses")。
所以,只要切换你的两个循环就可以了。
PS:不需要传递n_row
和n_col
。您可以通过 xpMat->nrow()
和 xpMat->ncol()
或 mat.nrow()
和 mat.ncol()
.