這篇主要記錄一下如何實現(xiàn)對數(shù)據(jù)庫的并行運算來節(jié)省代碼運行時間。語言是Python,其他語言思路一樣。
前言
一共23w條數(shù)據(jù),是之前通過自然語言分析處理過的數(shù)據(jù),附一張截圖:
要實現(xiàn)對news主體的讀取,并且找到其中含有的股票名稱,只要發(fā)現(xiàn),就將這支股票和對應(yīng)的日期、score寫入數(shù)據(jù)庫。
顯然,幾十萬條數(shù)據(jù)要是一條條讀寫,然后在本機上操作,耗時太久,可行性極低。所以,如何有效并行的讀取內(nèi)容,并且進行操作,最后再寫入數(shù)據(jù)庫呢?
并行讀取和寫入
并行讀?。簞?chuàng)建N*max_process個進程,對數(shù)據(jù)庫進行讀取。讀取的時候應(yīng)該注意:
每個進程需要分配不同的connection和對應(yīng)的cursor,否則數(shù)據(jù)庫會報錯。
數(shù)據(jù)庫必須能承受相應(yīng)的高并發(fā)訪問(可以手動更改)
實現(xiàn)的時候,如果不在進程里面創(chuàng)建新的connection,就會發(fā)生沖突,每個進程拿到權(quán)限后,會被下個進程釋放,所以匯報出來NoneType Error的錯誤。
并行寫入:在對數(shù)據(jù)庫進行更改的時候,不可以多進程更改。所以,我們需要根據(jù)已有的表,創(chuàng)建max_process-1個同樣結(jié)構(gòu)的表用來寫入。表的命名規(guī)則可以直接在原來基礎(chǔ)上加上1,2,3...數(shù)字可以通過對max_process取余得到。
此時,對應(yīng)進程里面先后出現(xiàn)讀入的conn(保存消息后關(guān)閉)和寫入的conn。每個進程對應(yīng)的表的index就是 主循環(huán)中的num對max_process取余(100->4,101->5),這樣每個進程只對一個表進行操作了。
部分代碼實現(xiàn)
max_process = 16 #最大進程數(shù)def read_SQL_write(r_host,r_port,r_user,r_passwd,r_db,r_charset,w_host,w_port,w_user,w_passwd,w_db,w_charset,cmd,index=None): #得到tem字典保存著信息 try: conn = pymysql.Connect(host=r_host, port=r_port, user=r_user, passwd =r_passwd,&nbs