這篇主要記錄一下如何實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的并行運(yùn)算來節(jié)省代碼運(yùn)行時(shí)間。語言是Python,其他語言思路一樣。


前言

一共23w條數(shù)據(jù),是之前通過自然語言分析處理過的數(shù)據(jù),附一張截圖:
電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

要實(shí)現(xiàn)對(duì)news主體的讀取,并且找到其中含有的股票名稱,只要發(fā)現(xiàn),就將這支股票和對(duì)應(yīng)的日期、score寫入數(shù)據(jù)庫(kù)。

顯然,幾十萬條數(shù)據(jù)要是一條條讀寫,然后在本機(jī)上操作,耗時(shí)太久,可行性極低。所以,如何有效并行的讀取內(nèi)容,并且進(jìn)行操作,最后再寫入數(shù)據(jù)庫(kù)呢?


并行讀取和寫入

  • 并行讀取:創(chuàng)建N*max_process個(gè)進(jìn)程,對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀取。讀取的時(shí)候應(yīng)該注意:

    1. 每個(gè)進(jìn)程需要分配不同的connection和對(duì)應(yīng)的cursor,否則數(shù)據(jù)庫(kù)會(huì)報(bào)錯(cuò)。

    2. 數(shù)據(jù)庫(kù)必須能承受相應(yīng)的高并發(fā)訪問(可以手動(dòng)更改)

實(shí)現(xiàn)的時(shí)候,如果不在進(jìn)程里面創(chuàng)建新的connection,就會(huì)發(fā)生沖突,每個(gè)進(jìn)程拿到權(quán)限后,會(huì)被下個(gè)進(jìn)程釋放,所以匯報(bào)出來NoneType Error的錯(cuò)誤。

  • 并行寫入:在對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改的時(shí)候,不可以多進(jìn)程更改。所以,我們需要根據(jù)已有的表,創(chuàng)建max_process-1個(gè)同樣結(jié)構(gòu)的表用來寫入。表的命名規(guī)則可以直接在原來基礎(chǔ)上加上1,2,3...數(shù)字可以通過對(duì)max_process取余得到。

此時(shí),對(duì)應(yīng)進(jìn)程里面先后出現(xiàn)讀入的conn(保存消息后關(guān)閉)和寫入的conn。每個(gè)進(jìn)程對(duì)應(yīng)的表的index就是 主循環(huán)中的num對(duì)max_process取余(100->4,101->5),這樣每個(gè)進(jìn)程只對(duì)一個(gè)表進(jìn)行操作了。


部分代碼實(shí)現(xiàn)

max_process = 16 #最大進(jìn)程數(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
        
		

網(wǎng)友評(píng)論