在R中并行读取和处理文件

Iml*_*ith 6 parallel-processing file-io r large-files

我正在使用parallelR中的库来处理我正在应用复杂操作的大型数据集.

为了提供可重现的代码,您可以在下面找到一个更简单的示例:

#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)
Run Code Online (Sandbox Code Playgroud)

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

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

小智 4

matrix您是否尝试list在每个文件中保存N个矩阵,而不是将每个文件保存在单独的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)
}
Run Code Online (Sandbox Code Playgroud)

您应该更换节省I/O一段时间,甚至在计算forlapply.