我最近测试了一个小的Ruby脚本,当我决定将(zf)grep的速度与我的脚本进行比较时,在一个大的g-zipped文件中输出包含特定匹配模式的行。我可能过于简单化,但从我所知道的情况来看,我的脚本似乎比类似的grep函数快得多地运行。
我正在使用大约800 MB的g-zipped XML文件,我的典型grep函数如下所示:
zfgrep "expression-to-match" file_name.xml.gz
我正在寻找一个只在文件中出现一次的特定字符串值,这通常需要大约6-7分钟才能完成我的2010年中期MacBook Pro。我正在比较这个剧本:
require 'zlib'
expr, file = ARGV[0], ARGV[1]
Zlib::GzipReader.open(file) { |gz|
gz.each { |line|
puts line if line[expr]
}
}
我使用类似的语法来运行脚本:
ruby script.rb "expression-to-match" file_name.xml.gz
Ruby脚本运行大约40-50秒。我对运行时优化没有很好的理解,所以我想知道为什么Ruby进程在我的机器上要快得多。显然,就其使用的选项而言,它并不像grep那么灵活,但对于我正在做的事情,我并不需要那种灵活性。
答案 0 :(得分:0)
正如上面的评论中所讨论的,您的脚本没有进行正则表达式测试,而是进行简单的子字符串搜索。
您需要将脚本更改为类似的功能来测试类似功能:
expr, file = Regexp.new(ARGV[0]), ARGV[1]