【发布时间】:2014-10-01 19:43:14
【问题描述】:
我有一个 awk 脚本,用于计算完成某些事务所需的时间。该脚本获取每个事务的唯一 ID,并存储每个事务的最小和最大时间戳。然后计算差异,最后显示超过 60 秒的结果。
与几千 (200k) 一起使用时效果很好,但在现实世界中使用时需要更多时间。我测试了几次,处理大约2800万行大约需要15分钟。我可以考虑这个良好的性能还是可以改进它?
我愿意接受任何建议。
这里有完整的代码
zgrep -E "\(([a-z0-9]){15,}:" /path/to/very/big/log | awk '{
gsub("[()]|:.*","",$4); #just removing ugly chars
++cont
min=$4"min" #name for maximun value of current transaction
max=$4"max" #same as previous, just for readability
split($2,secs,/[:,]/) #split hours,minutes and seconds
seconds = 3600*secs[1] + 60*secs[2] + secs[3] #turn everything into seconds
if(arr[min] > seconds || arr[min] == 0)
arr[min]=seconds
if(arr[max] < seconds)
arr[max]=seconds
dif=arr[max] - arr[min]
if(dif > 60)
result[$4] = dif
}
END{
for(x in result)
print x" - "result[x]
print ":Processed "cont" lines"
}'
【问题讨论】:
-
关于编辑:部分 print "new MO found! "name " start at "seconds (我为 min[name] 赋值的块) 仅执行 ~=800 次,但最后,它报告min的长度约为80k,这是非价值索引的数量