python高效解析日誌入庫

 

python腳本解析日誌文件入庫通常有三個重要的步驟:讀文件、解析文件、入庫。在這三個方面下功夫,可確保咱們得到最優的性能(這裏不討論併發)
python

1 讀文件:一次讀一行,磁盤IO太多,效率低下;一次性讀如所有文件內容,可能內存不夠。採起一個折中的辦法,每次讀若干byte(具體大小視實際狀況而定)。正則表達式

通過測試,獲得結論,在咱們寫代碼的時候應該這樣寫併發

f = open(path,'r')性能

for line in f :測試

     .............優化

這是系統提供的一種讀文件的方法,通常比咱們本身每次讀若干byte要快(f.read(20000)),具體怎麼作到的,如今還不清楚。總之,系統提供的,spa

應該差不了,否則也太丟人。啊哈!線程

2 解析日誌,若是用到正則表達式,應該先編譯而後再查找,這樣能夠提升速度。例如 :日誌

  regex0 = re.compile("(^|;)mobile=(\d+)")隊列

  mobile_number=regex0.search(self.resp_log).group(2)

  固然,這是一個大方面,精細的方面咱們還要在正則的寫法上下功夫。關於Python的正則的高效寫法,後續會專門用一邊文章來寫。

3 入庫:網上有好多建議使用executemany()這個寫法,insert into tablename(xx,xx) values(yy,yy),(yy,yy)....的形式卻會快不少,

咱們應 該直接把咱們的SQL拼接成這種形式,效率遠遠高於executemany(),具體一次性要插入多少行,本身測一下哦。每秒1W應該沒問題。

==============================================================================

按照上面的寫法,能夠保證讀文件、解析文件、入庫每一個環節都作到最優,可是在總體結構上還有優化的空間,詳細以下:

1  啓一個線程readThread只負責讀文件,而後把讀到的內容放到隊列Queue1中;

2  啓一個線程manageThread只負責解析文件內容,而後把解析好的東西放到Queue2中;

3  啓動第三個線程writeDB負責將解析好的文件內容入庫;

4 開啓一個後臺線程對一、二、3三個線程的運行情況進行監控、記錄與處理。

相關文章
相關標籤/搜索