如何加速 R 中的 CSV 文件读取

How to accelerate CSV file reading in R

根文件夹是 D:/data/。在这个根文件夹中有许多子文件夹。 CSV 文件存储在子文件夹中,例如

D:/data/
   f1
      1.csv
      2.csv
   f2
      1.csv
      2.csv

我使用以下代码读取我的 CSV 文件。但是,读取大约 20,000 个 CSV 文件需要几个小时。

allFolders = list.files("D:/data/")
for(folder in 1:length(allFolders))
{
  dirPath = paste0("D:/data/", allFolders[folder], '/')
  for(i in 1:100)
  {   
    f = fread(paste0(dirPath, i, ".csv"))
    # data processing
  }
}

知道如何在 Windows 上加快这个过程吗?我尝试使用 foreach 包,但是性能几乎相同,可能是由于 I/O 设备的速度限制。

更新:

我就是这样实现的 foreach:

allFolders = list.files("D:/data/")
for(folder in 1:length(allFolders))
{
  allf <- vector(mode = "list", length = 100)
  allf <- foreach(i=1:100, .combine=rbind)
  {   
    f = data.table::fread(paste0(dirPath, i, ".csv"))
    f
  }
}

lapplysapply 而不是 for 循环可能会有所帮助。

进一步补充: 也许想出一种方法来清理这些数据。将数据存储在 20,000 个不同的 .csv 文件中似乎效率极低。当我处理大型数据集(文件数量或大小)时,我尝试通过多个步骤进行清理,并仅将我需要的数据保存在 .rds 文件中以便于读入 R。

allFolders = list.files("D:/data/")

folders_as_list <- lapply(1:length(allFolders), function(i){
                     dirPath <- file.path("D:/data/", allFolders[i])
                      res <- lapply(1:100, function(j){
                              f <- fread(paste0(dirPath, j, ".csv"))
                              [DATA PROCESSING]
                              return(f_processed) 
                             }) %>% rbind_all
                     return(res)
                   })

return 1:length(allFolders) 的列表,其中列表中的每个元素都是一个 data.frame,其中单个文件夹中的所有单个 .csv 文件都已r绑定在一起。