私は現在、連続した関数呼び出しを可能にする実装を見つけようとしています。ここでは、ビッグ・マトリックスの各要素(最大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'の場合、ループ内の要素にアクセスする方法や、キャッシュされた要素を削除する方法が改善されていますか?
ありがとうございました!
良いヒント!スピードを少し改善しましたが、残念ながらボトルネックはハードディスクからデータを読み取っていることがわかりました。したがって、コーディングの観点からは改善するものはないようです。 –
このデータはわずか7GBです。 7GBまたはRAM以上の空き容量がある場合は、特に2回目、3回目など、読み込みが非常に速いはずです。 –