使用Ruby进行Log分析:放弃String.split,使用Regexp.match

使用Ruby进行log分析,它的性能成为一个瓶颈。
传统在perl中通过split的方式进行字段抽取的工作,在ruby中性能变的极差。
对一个32万行的log文件进行统计,抽取其中一个字段进行累加。
原有采用split方式,脚本运行时间在12~13s,且CPU占用较高。这种情况下,进行实施数据分析的消耗巨大,无法大范围部署。
而让这一状况得以改观的是,采用Regexp.match(str)进行抽取,计算速度有了非常大的改善,在2s内完成了计划的任务。

---------------
lax@mib ~ $ cat accounting_total_reqs.rb
#!/usr/bin/env ruby

f = File.open("NginxAccounting.log")
regex = Regexp.new(/req_total:(\d+)/)

tp = 0
while(f.gets)
    $_.scan(regex)
    tp += $1.to_i if $1
end
puts tp
---------------

采用str.scan(regex),速度比较满意:
lax@mib ~ $ time ruby accounting_total_reqs.rb
12437322629

real    0m1.786s
user    0m1.753s
sys    0m0.031s

调整为regex.match(str)方法后,速度又有少量提升:

lax@mib ~ $ time ruby 5.rb
12437322629

real    0m1.603s
user    0m1.570s
sys    0m0.031s



Liu Lantao
EMAIL: liulantao ( at ) gmail ( dot ) com ;
WEBSITE: http://www.liulantao.com/ .