저는 현재 연속 함수 호출을 허용하는 구현을 찾으려고합니다. 각 호출에서 큰 매트릭스의 각 요소 (최대 1.5e9 항목의 double 값)가 필요합니다.Rcpp에서 전체 파일 백업 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 정확히이 '첫째'요소를 호출하기 때문에 필요한가요? '예'인 경우 루프에서 요소에 액세스하거나 캐시 된 요소를 삭제하는 것이 더 나은 (성능 향상) 방법입니까?
도움을 주셔서 감사합니다.
좋은 팁! 속도는 약간 향상되었지만 불행히도 병목 현상은 하드 디스크에서 데이터를 읽는 중임을 발견했습니다. 따라서 코딩의 관점에서 개선 할 부분이없는 것 같습니다. –
이 데이터는 단지 7GB입니다. 사용 가능한 RAM이 7GB 이상인 경우 특히 읽기 두 번째, 세 번째 등 매우 빠릅니다. –