2016-08-06 6 views
5

복잡한 작업을 적용 할 대용량 데이터 세트를 처리하기 위해 R에서 parallel 라이브러리를 사용하고 있습니다. 재현 가능한 코드를 제공을 위해서 파일을 병렬로 읽고 읽는 중 R

, 당신은 간단한 예를 아래에서 찾을 수 있습니다

#data generation 
dir <- "C:/Users/things_to_process/" 

setwd(dir) 
for(i in 1:800) 
{ 
    my.matrix <- matrix(runif(100),ncol=10,nrow=10) 

    saveRDS(my.matrix,file=paste0(dir,"/matrix",i)) 
} 

#worker function 
worker.function <- function(files) 
{ 
    files.length <- length(files) 
    partial.results <- vector('list',files.length) 

    for(i in 1:files.length) 
    { 
     matrix <- readRDS(files[i]) 
     partial.results[[i]] <- sum(diag(matrix)) 
    } 

    Reduce('+',partial.results) 
} 


#master part 
cl <- makeCluster(detectCores(), type = "PSOCK") 

file_list <- list.files(path=dir,recursive=FALSE,full.names=TRUE) 

part <- clusterSplit(cl,seq_along(file_list)) 
files.partitioned <- lapply(part,function(p) file_list[p]) 

results <- clusterApply(cl,files.partitioned,worker.function) 

result <- Reduce('+',results) 

을 본질적으로, 대신 인터리브 방식으로 수행 될 병렬 파일을 읽으려고하면 궁금하고있다. 결과적으로 이러한 병목 현상으로 인해 병렬로 실행되는 작업의 예상 성능이 저하 될 수 있습니다.

목록에서 모든 행렬을 한 번에 읽은 다음이 목록의 청크를 처리하기 위해 각 코어에 보내면 더 좋을까요? 이 행렬이 훨씬 커지면 모든 목록을 한꺼번에로드 할 수 있습니까?

+0

먼저 모든 데이터를 읽은 다음 처리해야 할 이유가 없습니다. 귀하의 파이프 라인은 나를 위해 매우 효율적으로 보입니다 (대개 비슷한 것을 사용합니다). 많은 파일을 처리하면 일정 시간이 지나면 시스템로드가 균일하게됩니다. 병목 현상은 무엇이라고 생각하십니까? 계산 또는 I/O? –

+1

@DmitriySelivanov 필자는 작업자 함수를 프로파일 링했으며, 병목 현상은 주로 readRDS() 함수로 인한 것입니다. 저는 근로자가 다른 사람들이 파일 읽기를 완료 할 때까지 기다려야 독서를 시작할 수 있기 때문에 이런 일이 일어나고 있다고 생각합니다. 운영 체제가 병렬 읽기를 처리하는 방법을 잘 모르겠습니다. 그리고 메모리의 모든 파일 데이터를로드하면 성능이 향상 될지 궁금합니다. – Imlerith

+0

압축에 문제가있을 수 있습니다. 약간의 압축을 사용합니까? ('saveRDS'는 기본적으로 그것을 적용합니다). 그러나 나는 대개 그것을 끄고 일은 많은 주인이된다. –

답변

4

각각의 matrix을 별도의 RDS 파일에 저장하는 대신 N 개의 행렬을 각각의 파일에 저장하려고 시도 했습니까? N은 단일 작업자가 처리 할 번호입니까? 당신은 lapplyfor을 대체하여도 계산에 어쩌면 I/O에 시간을 절약해야하고

worker.function <- function(file) { 
    matrix_list <- readRDS(file) 
    partial_results <- lapply(matrix_list, function(mat) sum(diag(mat))) 
    Reduce('+',partial.results) 
} 

: 같은

그런 다음 worker.function 보인다.

+0

실제로 k를 입력 변수로 사용하여 k- 배 교차 유효성 검사를 사용하고 있습니다. 솔루션을 사용하면 폴드 분할에 따라 폴드를 파일에 다시 저장해야한다는 것을 의미합니다. 이렇게하면 계산에 오버 헤드가 추가됩니다. 실제로 파일을 병렬로 읽으려고 할 때의 결과를 이해하고 싶었습니다 (운영 체제에서 어떻게 처리 할 것인가? 병목 현상을 일으킬 수있는 경우, 왜?) 두 번째 질문에서 모든 데이터를로드하는 대신에 메모리 (나는 Hadoop을 생각하고 있었고 이것이 DFS를 사용하는 것이 정당 할 수 있는지 여부) – Imlerith

+0

코드에서'file_list'에있는 각각의 파일은 한 명의 작업자 만 읽을 수 있습니까? 이 경우 같은 파일을 읽으려는 직원이 여러 명 있으면 안됩니다. k- 배증 검증과 관련하여 'k'값에 따라 데이터를 다시 저장할 필요가없는 k 개의 파일 (한 파일 씩)로 저장할 수 있습니다. –