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