gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:17:01 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com