2017-11-09 9 views
1

私は現在、連続した関数呼び出しを可能にする実装を見つけようとしています。ここでは、ビッグ・マトリックスの各要素(最大1.5e9項目の倍精度)への各コール・アクセスが必要です。Rcppでfile-backed big.matrixを完全に有効に連続してアクセスできますか?

私は、Rcppと一緒に行列を扱うためにbigmemoryパッケージを関数演算に使用しました。

もう少し明確にするには、次のコードを参照してください。

C++コード:Rで

// [[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); 
} 

ファンクションコール:

#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([email protected],nrows,ncols) 
IterateBigMatrix2([email protected],nrows,ncols) 

は残念ながら、連続した関数呼び出しがn_rows RESPを増加させるために、非常にいくつかの点で遅くなります。 n_cols。

私の質問:要素をbig.matrixへのアクセスがRAMを超過した場合は、最初のキャッシュされた要素の削除につながるが、連続した機能でbig.matrixの、まさにこの「最初の」の要素を呼び出すため

はこれです必要ですか? 'yes'の場合​​、ループ内の要素にアクセスする方法や、キャッシュされた要素を削除する方法が改善されていますか?

ありがとうございました!

答えて

0

Big.matrixオブジェクトは、標準R行列として列単位で格納されます。 これは、行列が実際には長いベクトル(互いに連結された列によって形成される)であることを意味します。

これは基本的に、連続したメモリ(「アクセスの局所性」)のデータにアクセスするために、列単位で列にアクセスし、行単位ではなく行にアクセスすることを示します。

したがって、は2つのループを切り替えるだけでOKになります。

PS:n_rown_colを渡す必要はありません。あなたはxpMat->nrow()xpMat->ncol()またはmat.nrow()mat.ncol()によってそれらを得ることができます。

+0

良いヒント!スピードを少し改善しましたが、残念ながらボトルネックはハードディスクからデータを読み取っていることがわかりました。したがって、コーディングの観点からは改善するものはないようです。 –

+0

このデータはわずか7GBです。 7GBまたはRAM以上の空き容量がある場合は、特に2回目、3回目など、読み込みが非常に速いはずです。 –

関連する問題