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三個線程的運行情況進行監控、記錄與處理。