2015-06-22 92 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次 –