为什么read.csv这么慢?

时间:2016-01-18 21:53:48

标签: r csv

已经浏览了stackoverflow上的问题很长一段时间,发现许多答案很有用,我终于遇到了一些我无法找到答案的问题。这也是我报名开始回馈社区的时间,当我遇到一个我可以有意义地做出贡献的问题时(可能是另一天)。

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

我很清楚R中的read.csv函数绝不是读取数据的最有效方法,许多问题和答案都涉及read.csv的替代方案,但这个问题的重点略有不同,我想提出了两个问题。

  1. 我想知道的是为什么read.csv这么慢?导致其性能不佳的开销是多少?
  2. 此外,我有很多计算机的财富,我可以测试一些代码,包括一台带有SSD的笔记本电脑和一台带有标准硬盘的台式机,在最近的测试中我一直无法找到明显的区别。在任何一台机器上读取时间(我希望使用固态驱动器的读取时间要快得多),为什么会出现这种情况呢?
  3. 一些代码重现了我一直在测试的那种基准:

        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
        }
    

    我会很感激任何想法或评论,此外,如果我错过了类似的问题,请随时指出我正确的方向。非常感谢

1 个答案:

答案 0 :(得分:0)

相当大的性能提升是参数colClasses。性能提升通常是两倍。

我在阅读大型csv文件的代码中通常做的是以下过程:

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