簡體   English   中英

在R中並行讀取和處理文件

[英]reading and processing files in parallel in R

我在R中使用parallel庫來處理我正在應用復雜操作的大型數據集。

為了提供可重現的代碼,您可以在下面找到一個更簡單的示例:

#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)

本質上,我想知道是否嘗試並行讀取文件將以交錯方式完成。 結果,如果這個瓶頸會降低並行運行任務的預期性能?

如果我首先在列表中一次讀取所有矩陣然后將此列表的塊發送到每個核心以便進行處理,那會更好嗎? 如果這些矩陣更大,我能夠立即將它們全部加載到列表中嗎?

您是否嘗試在每個文件中保存N個矩陣list ,而不是將每個matrix保存在單獨的RDS文件中,其中N是單個工作人員要處理的數字?

然后worker.function看起來像:

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

您應該在I / O上節省一些時間,甚至可以通過用lapply替換for來進行lapply

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM