【问题标题】:Why is read.csv so slow?为什么 read.csv 这么慢?
【发布时间】:2016-01-18 21:53:48
【问题描述】:

浏览stackoverflow上的问题很长时间,发现很多有用的答案,我终于遇到了一些我找不到答案的东西。这也是我注册开始回馈社区的时候了,因为当我遇到一个我可以有意义地做出贡献的问题时(那可能是另一天)。

无论如何,我的第一个 stackoverflow 问题,所以请对我温柔一点:

我很清楚 R 中的 read.csv 函数绝不是读取数据的最有效方式,许多问题和答案都涉及 read.csv 的替代方案,但我认为这个问题的重点略有不同确实有两个问题被问到。

  1. 我想知道的是为什么 read.csv 这么慢?导致其性能不佳的开销是什么?
  2. 此外,我还拥有许多可以测试代码位的计算机,包括带 SSD 的笔记本电脑和带标准 HDD 的台式机,在最近的测试中,我无法找到两者之间的明显区别两台机器上的读取时间(我原本预计使用固态驱动器的读取时间会快得多),为什么会出现这种情况?

一些代码可以重现我一直在测试的那种基准:

    bm_io = function (runs = 3, n = 1e6, ncol = 1000) {
      set.seed(1)
      on.exit(set.seed(NULL))
      x = rnorm(n)
      m = data.frame(matrix(x, ncol = ncol))
      timings = data.frame(user = numeric(2 * runs), system = 0, 
                   elapsed = 0, test = c("write", "read"))
      for (i in 1:runs) {
        fname = tempfile(fileext = ".csv")
        fname = "temp.csv"
        invisible(gc())
        timings[2 * i - 1, 1:3] = system.time({
          write.csv(m, fname, row.names = FALSE)
        })[1:3]
        timings[2 * i, 1:3] = system.time({
          read.csv(fname)
        })[1:3]
        unlink(fname)
      }
      timings
    }

我将不胜感激任何对此的想法或 cmet,此外,如果我错过了类似的问题,请随时为我指出正确的方向。非常感谢

【问题讨论】:

    标签: r csv


    【解决方案1】:

    显着的性能提升是参数colClasses。性能提升通常是两倍。

    我在读取大型 csv 文件的代码中通常会执行以下过程:

    • 使用nrows读取前几行
    • 从读取的数据帧的列中提取类
    • 使用colClasses 加载带有提取类的整个数据框
    • 如果由于不可预见的数据而失败,请使用不带colClasses 的整个数据

    【讨论】:

    • 您好,感谢您抽出宝贵时间回复。我知道read.csv 有很多参数可以提高性能。尽管它们都没有接近 data.table 包中的 fread 之类的东西。我的问题更多是关于是什么让read.csv 与某些替代方案相比如此缓慢,以及为什么我在从 SSD 或 HDD 读取时看不到我所期望的差异。
    猜你喜欢
    • 2021-09-03
    • 2016-09-28
    • 2020-02-08
    • 2012-07-17
    • 2011-11-07
    • 2015-08-24
    • 2013-08-06
    • 2014-07-16
    • 2011-01-02
    相关资源
    最近更新 更多