使用Ruby进行Log分析:放弃String.split,使用Regexp.match
Ruby
使用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/ .
传统在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/ .