2016-01-18 137 views
-3

很长时间浏览了stackoverflow上的问题,发现很多有用的答案,我终于遇到了一些我无法找到答案的东西。这也是我注册时开始回馈社区的时候,因为当我遇到一个我可以做出有意义贡献的问题时(也许还有一天)。为什么read.csv这么慢?

不管怎样,我的第一个计算器的问题,所以请温柔与我:

我深知R中的read.csv功能绝不是在读取数据时,许多问题,最有效的方法答案涉及read.csv的替代方案,但这个问题的重点略有不同,我想有两个问题需要问。

  1. 我想知道的是为什么read.csv太慢了?什么是造成其糟糕表现的开销?
  2. 此外,我有很多计算机的财富,我可以测试一些代码,包括一台带SSD的台式机和一台带有标准硬盘的台式机,在最近的测试中,我一直没能找到一个明显的区别在任何一台机器上读取时间(我预计使用固态驱动器的读取时间会更快),为什么会出现这种情况?

一些代码重现排序基准的,我一直在测试:

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 
    } 

我希望有这方面的那些想法或意见,另外,如果我错过了一个类似的问题,请随时自由地指向正确的方向。非常感谢

回答

0

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

我通常做在我的代码读取大的CSV文件是以下过程:

  • 读取使用nrows
  • 从读取数据帧的列提取类前几排的
  • 负载使用colClasses
  • 如果失败由于不可预见的数据使用整个数据,而无需colClasses
  • 与提取的类的全部数据帧
+0

嗨,感谢您花时间回复。我知道'read.csv'有很多参数可以提高性能。虽然他们没有一个像'data.table'包中的'fread'那么接近。我的问题更多的是关于什么使得'read.csv'与其他一些选择相比如此缓慢,以及为什么我从SSD或硬盘读取数据时看不到有什么区别。 – jamieRowen