【问题标题】:Efficiently reading specific lines from large files into R有效地将大文件中的特定行读入 R
【发布时间】:2013-08-14 23:45:23
【问题描述】:

我对 R 从大文件 (11GB+) 中读取特定行需要多长时间感到惊讶。例如:

> t0 = Sys.time()
> read.table('data.csv', skip=5000000, nrows=1, sep=',')
      V1       V2 V3 V4 V5   V6    V7
1 19.062 56.71047  1 16  8 2006 56281
> print(Sys.time() - t0)
Time difference of 49.68314 secs

OSX 终端可以立即返回特定的行。有人知道 R 中更有效的方法吗?

【问题讨论】:

  • 效率低下,因为read.table 调用readLines(file, skip) 实际上解析行并读入R,然后将它们丢弃。为了提高效率,我认为您必须通过连接纠正一些 seek()d 的 C 代码,直到您看到足够的换行符(并且您需要适当地使用缓冲以提高速度)

标签: r


【解决方案1】:

你可以使用这样的东西

 dat <- read.table(pipe("sed -n -e'5000001p' data.csv"), sep=',')

只读取使用其他 shell 工具提取的行。

另请注意,system.time(someOps) 是一种更简单的时间测量方法。

【讨论】:

  • 谢谢德克。这个公式对我有用:dat &lt;- read.table(pipe("sed '5000000q;d' data.csv"), sep=',')
  • 或范围:read.table(pipe("sed -n '5000010q;5000000,5000010p' data.csv"), sep=',')
  • 对不起,错过了地址后面的p。现在更正了。如果您知道范围,则 sed 和 awk 都有多种选择。
  • 嗯,这已经很旧了,但如果有人还在,你能告诉我为什么这最终也会变得有点慢吗?因为使用命令行我可以立即获取该行但是当我将它发送到 R 时需要更多时间
  • 因为R默认读取每一行(除非你使用例如skip=Nread.table()等pp)。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 2011-12-18
  • 2012-12-26
  • 2014-07-17
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多