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

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

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

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

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

最佳答案

而不是保存每个 matrix在单独的 RDS 文件中,您是否尝试过保存 list每个文件中有 N 个矩阵,其中 N 是单个工作人员要处理的数量?

然后是worker.function好像:

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

您应该通过替换 for 来节省一些 I/O 甚至计算时间。与 lapply .

关于在 R 中并行读取和处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38800038/

相关文章:

c++ - 从文件中读取。多个分隔符? C++

file-io - 将字节数组的大块写入文件VB6

c - 从 2 位分支预测器到 8 位预测器

python - 为什么我的并行性能达到顶峰?

r - 强制将编码从未知设置为 UTF-8 或 R 中的任何编码?

r - 如何在 R 中的 ggplot 的一个图中绘制 2 个不同 y 轴上的两个列向量?

file-io - 如何通过 Mikrotik 路由器的脚本创建新文件

parallel-processing - ipython 笔记本 : how to parallelize external script

r - 使用 docx2pdf 将 docx.files 转换为 pdf.files

r - 从 1 和 0 的向量中,如何只保留第一个 0 之前的那些?