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