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

本质上,我想知道尝试并行读取文件是否会以交错方式完成。如果这个瓶颈会因此降低 运行 并行任务的预期性能?

如果我先一次读取列表中的所有矩阵,然后将这个列表的块发送到每个核心以进行处理,会不会更好?如果这些矩阵更大,我是否能够一次将它们全部加载到列表中?

您是否尝试过在每个文件中保存一个 list 的 N 个矩阵,而不是将每个 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 上节省一些时间,甚至可以通过将 for 替换为 lapply 来节省计算时间。