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

时间:2015-01-23 14:30:40

标签: r file csv fread

根文件夹是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
  }
}

1 个答案:

答案 0 :(得分:1)

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)
                   })

哪个应该返回1:length(allFolders)的列表,其中列表中的每个元素都是data.frame,其中单个文件夹中的所有单个.csv文件已经被绑定在一起。