在R中并行读取和处理文件
reading and processing files in parallel in R
我正在使用 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)
本质上,我想知道尝试并行读取文件是否会以交错方式完成。如果这个瓶颈会因此降低 运行 并行任务的预期性能?
如果我先一次读取列表中的所有矩阵,然后将这个列表的块发送到每个核心以进行处理,会不会更好?如果这些矩阵更大,我是否能够一次将它们全部加载到列表中?
您是否尝试过在每个文件中保存一个 list
的 N 个矩阵,而不是将每个 matrix
保存在一个单独的 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)
}
您应该在 I/O 上节省一些时间,甚至可以通过将 for
替换为 lapply
来节省计算时间。
我正在使用 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)
本质上,我想知道尝试并行读取文件是否会以交错方式完成。如果这个瓶颈会因此降低 运行 并行任务的预期性能?
如果我先一次读取列表中的所有矩阵,然后将这个列表的块发送到每个核心以进行处理,会不会更好?如果这些矩阵更大,我是否能够一次将它们全部加载到列表中?
您是否尝试过在每个文件中保存一个 list
的 N 个矩阵,而不是将每个 matrix
保存在一个单独的 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)
}
您应该在 I/O 上节省一些时间,甚至可以通过将 for
替换为 lapply
来节省计算时间。