让我们从强制性请求开始,看看您尝试了什么。
处理日志文件时,可伸缩性是一个大问题,因为它们会变得非常大。扩展格式比标准日志格式小,但您仍然必须注意消耗大量 RAM 的可能性。
您可以使用正则表达式或简单的子字符串提取。子字符串提取速度更快,但缺乏酷因素。
需要“基准”
TIME_REGEX = /(\d\d:\d\d:\d\d)/
ACTION_REGEX = /(\w+)/
FILEPATH_REGEX = /(\S+)/
ary = %(#Version: 1.0
#日期:1996 年 1 月 12 日 00:00:00
#Fields: time cs-method cs-uri
00:34:23 获取 /foo/bar.html
12:21:16 获取 /foo/bar.html
12:45:52 获取 /foo/bar.html
12:57:34 获取 /foo/bar.html
).split(/\n+/)
n = 50000
Benchmark.bm(6) 做 |x|
x.report('regex') 做
n.次做
ary.each 做 |l|
接下来如果 l[/^#/]
l.strip!
# l[/^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/ix]
# l =~ /^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/ix
l =~ /^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/iox
时间戳、操作、文件路径 = $1、$2、$3
结尾
结尾
结尾
x.report('substr') 做
n.次做
ary.each 做 |l|
接下来如果 l[/^#/]
l.strip!
时间戳 = l[0, 8]
动作 = l[9, 3]
文件路径 = l[14 .. -1]
结尾
结尾
结尾
结尾
# >> 用户系统总实数
# >> 正则表达式 1.220000 0.000000 1.220000 ( 1.235210)
# >> substr 0.800000 0.010000 0.810000 (0.804276)
尝试运行不同的正则表达式,看看细微的变化如何在运行时产生很大的不同。
在基准代码的正则表达式和子字符串版本中,您可以提取ary.each do
循环作为您正在寻找的基础。