在Ruby中解析大文件的最快方法

时间:2011-05-10 20:24:35

标签: ruby

我有一个约150mb的简单文本文件。我的代码将读取每一行,如果它匹配某些正则表达式,它将被写入输出文件。 但是现在,只需要很长时间来遍历文件的所有行(几分钟),就像

一样
File.open(filename).each do |line|
  # do some stuff
end

我知道这是循环文件的线路需要一段时间,因为即使我对“#do some stuff”中的数据什么都不做,它仍然需要很长时间。

我知道有些unix程序几乎可以立即解析像这样的大文件(比如grep),所以我想知道为什么ruby(MRI 1.9)需要这么长时间才能读取文件,是否有某种方法可以让它更快?

3 个答案:

答案 0 :(得分:4)

grep进行比较并不公平,因为这是一个高度调整的实用程序,只扫描数据,不会存储任何数据。当您使用Ruby读取该文件时,您最终会为每一行分配内存,然后在垃圾收集周期中释放它。 grep是一台非常精简且均值的正则表达式处理机。

您可能会发现使用grep调用system等外部程序或通过管道设施可以达到所需的速度:

`grep ABC bigfile`.split(/\n/).each do |line|
  # ... (called on each matching line) ...
end

答案 1 :(得分:2)

File.readlines.each do |line|
  #do stuff with each line
end

将整个文件读入一行数组。它应该快得多,但它需要更多的内存。

答案 2 :(得分:-2)

您应该将其读入内存然后解析。当然这取决于你在寻找什么。不要指望ruby的奇迹表现,特别是与过去30年优化的c / c ++程序相比; - )