python高效解析日志入庫


 

python腳本解析日志文件入庫一般有三個重要的步驟:讀文件、解析文件、入庫。在這三個方面下功夫,可確保我們獲得最優的性能(這里不討論並發)

1 讀文件:一次讀一行,磁盤IO太多,效率低下;一次性讀如全部文件內容,可能內存不夠。采取一個折中的辦法,每次讀若干byte(具體大小視實際情況而定)。

經過測試,得到結論,在我們寫代碼的時候應該這樣寫

f = open(path,'r')

for line in f :

     .............

這是系統提供的一種讀文件的方法,一般比我們自己每次讀若干byte要快(f.read(20000)),具體怎么做到的,現在還不清楚。總之,系統提供的,

應該差不了,不然也太丟人。啊哈!

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 開啟一個后台線程對1、2、3三個線程的運行狀況進行監控、記錄與處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM