2017-11-09 11 views
1

저는 현재 연속 함수 호출을 허용하는 구현을 찾으려고합니다. 각 호출에서 큰 매트릭스의 각 요소 (최대 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 정확히이 '첫째'요소를 호출하기 때문에 필요한가요? '예'인 경우 루프에서 요소에 액세스하거나 캐시 된 요소를 삭제하는 것이 더 나은 (성능 향상) 방법입니까?

도움을 주셔서 감사합니다.

답변

0

표준 R 행렬 인 Big.matrix 객체는 열 단위로 저장됩니다. 이것은 행렬이 실제로 긴 벡터 (서로 연결된 열로 구성됨)임을 의미합니다.

이것은 기본적으로 인접한 메모리 ("액세스의 지역성")에있는 데이터에 액세스하기 위해 열을 기준으로 열을 액세스하고 행을 기준으로 열에 액세스하지 말라고 알려줍니다.

따라서 은 두 개의 루프를 전환하기 때문에 OK이어야합니다.

PS : n_rown_col을 전달할 필요가 없습니다. xpMat->nrow()xpMat->ncol() 또는 mat.nrow()mat.ncol()을 통해 광고를 가져올 수 있습니다.

+0

좋은 팁! 속도는 약간 향상되었지만 불행히도 병목 현상은 하드 디스크에서 데이터를 읽는 중임을 발견했습니다. 따라서 코딩의 관점에서 개선 할 부분이없는 것 같습니다. –

+0

이 데이터는 단지 7GB입니다. 사용 가능한 RAM이 7GB 이상인 경우 특히 읽기 두 번째, 세 번째 등 매우 빠릅니다. –