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

时间:2016-08-06 02:32:40

标签: r file-io parallel-processing large-files

我正在使用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)

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

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

1 个答案:

答案 0 :(得分:5)

您是否尝试在每个文件中保存<td></td>个N矩阵,而不是将每个matrix保存在单独的RDS文件中,其中N是单个工作人员将要处理的数字?

然后list看起来像:

worker.function

您应该在I / O上节省一些时间,甚至可以通过将worker.function <- function(file) { matrix_list <- readRDS(file) partial_results <- lapply(matrix_list, function(mat) sum(diag(mat))) Reduce('+',partial.results) } 替换为for来计算。