2013-08-29 30 views
2

我必須在python中使用reg ex解析大型日誌文件(2GB)。在日誌文件中,正則表達式匹配我感興趣的行。日誌文件也可能有不需要的數據。通過正則表達式解析大文件的最佳方法python

這裏是從文件的樣品:

"#DEBUG:: BFM [L4] 5.4401e+08ps MSG DIR:TX SCB_CB TYPE:DATA_REQ CPortID:'h8 SIZE:'d20 NumSeg:'h0001 Msg_Id:'h00000000" 

我的正則表達式是".DEBUG.*MSG."

首先,我將使用空格則拆分它「字段:值」的圖案被插入到sqlite3的數據庫;但對於大文件,解析文件需要大約10到15分鐘。

請建議在最短的時間內完成上述任務的最佳方法。

+1

你能發佈日誌行和模式的爲例你正在尋找? –

+0

格式將類似於「#DEBUG :: BFM [L4] 5.4401e + 08ps MSG DIR:TX SCB_CB TYPE:DATA_REQ CPortID:'h8 SIZE:'d20 NumSeg:'h0001 Msg_Id:'h00000000'且reg ex爲」。 DEBUG。*味精。「首先,我將使用空格將其分割,然後將「字段:值」模式插入到數據庫中。 – user2109788

+0

你可能更適合使用一個處理數據流的程序,比如'sed'。 –

回答

2

正如其他人所說的那樣,分析你的代碼,看看它爲什麼很慢。該cProfile模塊in conjunction with the gprof2dot tool可以產生很好的可讀信息

沒有看到你的速度慢的代碼,我可以猜到一些東西,這可能有助於:

首先是你大概可以使用內置的字符串的方法,而不是一個正則表達式的脫身 - 這可能稍微快一點。如果你需要使用正則表達式,那麼在主循環外部預編譯是值得的re.compile

其次是不要做一個插入查詢每行,而是做批量插入,例如添加解析信息到列表,然後當它達到一定的大小,用executemany方法執行一次INSERT查詢。

一些不完整的代碼,如上面的例子:

import fileinput 

parsed_info = [] 
for linenum, line in enumerate(fileinput.input()): 
    if not line.startswith("#DEBUG"): 
     continue # Skip line 

    msg = line.partition("MSG")[1] # Get everything after MSG 
    words = msg.split() # Split on words 
    info = {} 
    for w in words: 
     k, _, v = w.partition(":") # Split each word on first : 
     info[k] = v 

    parsed_info.append(info) 

    if linenum % 10000 == 0: # Or maybe if len(parsed_info) > 500: 
     # Insert everything in parsed_info to database 
     ... 
     parsed_info = [] # Clear 
0

「在最短的時間內完成上述任務的最佳方式」是首先找出時間正在進行的地方。研究如何分析您的Python腳本以查找哪些部分較慢。你可能有一個低效的正則表達式。寫入sqlite可能是問題。但是沒有什麼靈丹妙藥 - 一般來說,逐行處理2GB的文本,在Python中使用正則表達式可能會在幾分鐘內運行,而不是幾秒鐘。

下面是測試腳本,將顯示它需要多長時間來讀取文件,一行行,別的什麼也不做:

from datetime import datetime 

start = datetime.now() 
for line in open("big_honkin_file.dat"): 
    pass 
end = datetime.now() 
print (end-start) 
+0

感謝您的回覆保羅,其實我是新來的蟒蛇。我在我的一個項目中使用了它。那麼你能告訴我一般情況下,需要多長時間逐行讀取大文件(比如2GB)並打印出來?以及如何知道reg ex是有效的。如果你可以提供一些關於這個好的鏈接。 – user2109788

+0

@ user2109788 - 您將通過自己編寫這個簡單的測試腳本來了解更多信息。爲什麼不計時最簡單的控制情況?編寫一個逐行讀取文件的腳本,不要做任何事情。看看需要多長時間。然後打開輸出文件,並將讀取的行寫入輸出文件。看看需要多長時間。這些小測試應該給你一些關於你的正則表達式程序下界的一些想法。至於改進正則表達式本身,谷歌爲「正則表現」,你會得到一些關於這個問題的有用的文章。 – PaulMcG

0

保羅的回答是有道理的,你要明白,你「輸「時間第一。 最簡單的方法,如果你沒有一個分析器是發佈一個時間戳以毫秒爲單位,在你的算法的每個「步驟」之前和之後(打開文件,逐行讀取它(和裏面,分割/正則表達式到識別調試線),將它插入數據庫等等)。

沒有你的代碼的進一步瞭解,也有可能「陷阱」,這將是非常耗時: - 打開日誌文件幾次 - 打開DB每次你需要插入的內部,而不是打開一個連接數據的時間然後隨你寫

+1

幸運的是,python有一個夢幻般的內置詳細分析器,所以這裏的替代方法並不是必需的。 –