복잡한 작업을 적용 할 대용량 데이터 세트를 처리하기 위해 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)
을 본질적으로, 대신 인터리브 방식으로 수행 될 병렬 파일을 읽으려고하면 궁금하고있다. 결과적으로 이러한 병목 현상으로 인해 병렬로 실행되는 작업의 예상 성능이 저하 될 수 있습니다.
목록에서 모든 행렬을 한 번에 읽은 다음이 목록의 청크를 처리하기 위해 각 코어에 보내면 더 좋을까요? 이 행렬이 훨씬 커지면 모든 목록을 한꺼번에로드 할 수 있습니까?
먼저 모든 데이터를 읽은 다음 처리해야 할 이유가 없습니다. 귀하의 파이프 라인은 나를 위해 매우 효율적으로 보입니다 (대개 비슷한 것을 사용합니다). 많은 파일을 처리하면 일정 시간이 지나면 시스템로드가 균일하게됩니다. 병목 현상은 무엇이라고 생각하십니까? 계산 또는 I/O? –
@DmitriySelivanov 필자는 작업자 함수를 프로파일 링했으며, 병목 현상은 주로 readRDS() 함수로 인한 것입니다. 저는 근로자가 다른 사람들이 파일 읽기를 완료 할 때까지 기다려야 독서를 시작할 수 있기 때문에 이런 일이 일어나고 있다고 생각합니다. 운영 체제가 병렬 읽기를 처리하는 방법을 잘 모르겠습니다. 그리고 메모리의 모든 파일 데이터를로드하면 성능이 향상 될지 궁금합니다. – Imlerith
압축에 문제가있을 수 있습니다. 약간의 압축을 사용합니까? ('saveRDS'는 기본적으로 그것을 적용합니다). 그러나 나는 대개 그것을 끄고 일은 많은 주인이된다. –