2015-06-22 108 views
0

我必须经常分析非常大的(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有效地执行相同的计算?

回答

1

SQLite是一个嵌入式数据库,即它被设计成与'真正'的编程语言一起使用。

可能可以导入日志文件到数据库文件,但具有数据库的全部要点是的数据,这既不是对这个问题的直接目标,也不会提高效率(实际上,额外的文件会使一切变慢)。

这样的计算比较简单:

SELECT total, failed, failed/total AS ratio 
FROM (SELECT SUM(col1 + col2) AS total, 
      SUM(CASE col3 WHEN 404 THEN col1 + col2 END) AS failed 
     FROM MyTable) 

但这不是这个问题的缓慢部分,进口会。

这是一个例子,其中awk是该工作的最佳工具。

+0

是的,导入速度很慢,而且它需要数据验证(有时由于应用程序故障,日志可能不完整)。 但在某些特定情况下,它确实值得。 在我的测试数据集上,我使用查询得到了1m47s(sqlite)与15m27s(awk) 我知道它应该用于嵌入,但我认为我可以用它替换awk oneliners(至少我希望如此) –

+0

您的时间不包括进口,是吗?如果你想做多个查询,SQLite很有用。 –

+0

当然,进口时间不包括在内,花了30分钟,所以我只会使用sqlite,如果我需要从相同的日志中获取数据超过5次 –