【问题标题】:How to accelerate CSV file reading in R如何在 R 中加速 CSV 文件读取
【发布时间】:2015-01-23 14:30:40
【问题描述】:

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

【问题讨论】:

  • fread 通常是速度恶魔,我怀疑这不是瓶颈所在。您可以将 CSV 文件转换为 SQLite 数据库(或将它们作为表放在一个 SQLite 数据库中)吗?您可以发布您所做的foreach 尝试的设置代码吗?这可能与您进行并行处理配置的方式有关。
  • @hrbrmstr 我怀疑 SQLite 是否会提供改进
  • 您应该注意fread 来自data.table 包。如果确实是fread。它不在基础 R 中。
  • 读取一个 CSV 文件需要多长时间?然后弄清楚它是读取时间还是处理时间或循环。然后我们知道在哪里寻找优化。否则它的过早优化。
  • @y0gapants 这取决于瓶颈在哪里。您还可以使用 SQLite 强制表在内存中,这肯定会加快速度。

标签: r file csv fread


【解决方案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 文件都已被重新绑定在一起。

【讨论】:

  • 你可以为我的案例发布一个 lapply 的例子吗?
  • 很遗憾,我无法删除文件。所有这些都很重要。数据最初是以这种方式呈现的。顺便说一句,我的问题是我是否可以使用“list.files”从子文件夹中获取所有文件?
  • 我知道你不能删除这些文件,但如果你一直在处理文件,把它们加载到 R 中,清理它们并合并成大的 data.frames,然后保存可能是值得的它们作为 .rds 文件。至于list.files,它需要一个名为include.dirs 的参数,即:“逻辑。子目录名称是否应该包含在递归列表中?(它们总是在非递归列表中)。”以及recursive“逻辑。列表是否应该递归到目录中?”
  • 我现在没有时间为您提供明确的解决方案,但也许您可以通过r-bloggers.com/using-apply-sapply-lapply-in-rlapply 的介绍来解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2022-11-13
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
相关资源
最近更新 更多