我必须经常分析非常大的(abt 40Gb)文本文件(日志)。 通常AWK/grep足够满足我的需求,但日志越来越多,现在我很好奇sqlite3是否会让我更有效地做同样的事情。 我为我的测试选择了sqlite,因为它在我的Linux机器上安装了开箱即用的(SQLite版本3.6.4),而更复杂的工具会在这个简单的任务中引入太多开销。将AWK命令转换为sqlite查询
这是我一贯的awk查询之一(我简化在这个例子中的日志结构,实际上它由超过50场的):
zcat log*.gz | awk -F'|' '{total+=$1;total+=$2;if($3==404){failed+=$1;failed+=$2}}END{print "Total="total,"\nfailed="failed,"\nRatio="failed/total}'
所以在这里我们总结和变量字段1的值2 'total',另外如果field3 == 404变量'failed',我们将它们相加,然后通过除法计算比率。
我将日志转换为sqlite数据库,并准备开始性能测试......但发现sqlite不支持存储过程(我不是SQL人员,所以这是我第一次检查并开始sqlite),所以我现在还不清楚如何保持变量的中间值
是否有一些解决方法(不要使用存储过程)使用sqlite有效地执行相同的计算?
是的,导入速度很慢,而且它需要数据验证(有时由于应用程序故障,日志可能不完整)。 但在某些特定情况下,它确实值得。 在我的测试数据集上,我使用查询得到了1m47s(sqlite)与15m27s(awk) 我知道它应该用于嵌入,但我认为我可以用它替换awk oneliners(至少我希望如此) –
您的时间不包括进口,是吗?如果你想做多个查询,SQLite很有用。 –
当然,进口时间不包括在内,花了30分钟,所以我只会使用sqlite,如果我需要从相同的日志中获取数据超过5次 –