如何在并行R中填充一个非常大的数组

问题描述

我需要通过打开数千个 csv 文件提取数据列并将它们插入 3D 和 4D 矩阵来填充大量非常大的数组。我试过并行写这个,但总是发生的是当我的内存填满时我的计算机崩溃。我看过这个问题,Python code,但我没有得到这些建议对我有用。这是我的代码(在需要的地方通用):

tmin_array_1981_2010 <- array(NA,c(585,1386,366))
foreach (f = 1:500000,.packages=c('dplyr','lubridate')) %dopar% {
    data <- read.csv(file_name[f])
    tmin_array_1981_2010[y[f],x[f],] = data$column}

我在 foreach 循环中要做的还有很多,但这足以理解我想要做什么。我已经读到我可以使用 lapply 语句来并行化这段代码,但我不会假装我理解他们正在做什么或如何做。我也尝试过使用 abind 函数,如这篇博文 Parallel `for` loop with an array as output 所示,但它的性能比我上面的简单代码要差。

acomb <- function(...) abind(...,along=3)
foreach (f=1:18,.combine='acomb',.multicombine=TRUE,'lubridate','vroom','tidyverse')) %dopar% {
    data <- read.csv(file_name[f])
    tmin_array_1981_2010[y[f],] = data$column}

任何帮助都会很棒。谢谢。

解决方法

我想花时间的部分是阅读 CSV。

所以你总是可以返回list(y[f],x[f],data$column)(甚至只是data$column)并在以后填充数组。那就不要使用 .combine