我有一个约150mb的简单文本文件。我的代码将读取每一行,如果它匹配某些正则表达式,它将被写入输出文件。 但是现在,只需要很长时间来遍历文件的所有行(几分钟),就像
一样File.open(filename).each do |line|
# do some stuff
end
我知道这是循环文件的线路需要一段时间,因为即使我对“#do some stuff”中的数据什么都不做,它仍然需要很长时间。
我知道有些unix程序几乎可以立即解析像这样的大文件(比如grep),所以我想知道为什么ruby(MRI 1.9)需要这么长时间才能读取文件,是否有某种方法可以让它更快?
答案 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 ++程序相比; - )