这篇主要记录一下如何实现对数据库的并行运算来节省代码运行时间。语言是Python,其他语言思路一样。
前言
一共23w条数据,是之前通过自然语言分析处理过的数据,附一张截图:
要实现对news主体的读取,并且找到其中含有的股票名称,只要发现,就将这支股票和对应的日期、score写入数据库。
显然,几十万条数据要是一条条读写,然后在本机上操作,耗时太久,可行性极低。所以,如何有效并行的读取内容,并且进行操作,最后再写入数据库呢?
并行读取和写入
并行读取:创建N*max_process个进程,对数据库进行读取。读取的时候应该注意:
- 每个进程需要分配不同的connection和对应的cursor,否则数据库会报错。
- 数据库必须能承受相应的高并发访问(可以手动更改)
实现的时候,如果不在进程里面创建新的connection,就会发生冲突,每个进程拿到权限后,会被下个进程释放,所以汇报出来NoneType Error的错误。
- 并行写入:在对数据库进行更改的时候,不可以多进程更改。所以,我们需要根据已有的表,创建max_process-1个同样结构的表用来写入。表的命名规则可以直接在原来基础上加上1,2,3...数字可以通过对max_process取余得到。
此时,对应进程里面先后出现读入的conn(保存消息后关闭)和写入的conn。每个进程对应的表的index就是 主循环中的num对max_process取余(100->4,101->5),这样每个进程只对一个表进行操作了。
部分代码实现
max_process = 16 #最大进程数 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, db =r_db, charset =r_charset) cursor = conn.cursor() cursor.execute(cmd) except Exception as e: error = "[-][-]%d fail to connect SQL for reading" % index log_error('error.log',error) return else: tem = cursor.fetchone() print('[+][+]%d succeed to connect SQL for reading' % index) finally: cursor.close() conn.close() try: conn = pymysql.Connect(host=w_host, port=w_port, user=w_user, passwd =w_passwd, db =w_db, charset =w_charset) cursor = conn.cursor() cursor.execute(cmd) except Exception as e: error = "[-][-]%d fail to connect SQL for writing" % index log_error('error.log',error) return else: print('[+][+]%d succeed to connect SQL for writing' % index) r_dict = dict() r_dict['id'] = tem[0] r_dict['content_id'] = tem[1] r_dict['pub_date'] = tem[2] r_dict['title'] = cht_to_chs(tem[3]) r_dict['title_score'] =tem[4]![](http://images2015.cnblogs.com/blog/1172464/201706/1172464-20170609000900309-1810357590.png) r_dict['news_content'] = cht_to_chs(tem[5]) r_dict['content_score'] = tem[6] for key in stock_dict.keys(): #能找到对应的股票 if stock_dict[key][1] and ( r_dict['title'].find(stock_dict[key][1])!=-1 or r_dict['news_content'].find(stock_dict[key][1])!=-1 ): w_dict=dict() w_dict['code'] = key w_dict['english_name'] = stock_dict[key][0] w_dict['cn_name'] = stock_dict[key][1] #得到分数 if r_dict['title_score']: w_dict['score']=r_dict['title_score'] else: w_dict['score']=r_dict['content_score'] #开始写入 try: global max_process cmd = "INSERT INTO dyx_stock_score%d VALUES ('%s', '%s' , %d , '%s' , '%s' , %.2f );" % (index%max_process ,r_dict['content_id'] ,r_dict['pub_date'] ,w_dict['code'] ,w_dict['english_name'] ,w_dict['cn_name'] ,w_dict['score']) cursor.execute(cmd) conn.commit() except Exception as e: error = " [-]%d fail to write to SQL" % index cursor.rollback() log_error('error.log',error) else: print(" [+]%d succeed to write to SQL" % index) cursor.close() conn.close() def main(): num = 238143#数据库查询拿到的总数 p = None for index in range(1,num+1): if index%max_process==1: if p: p.close() p.join() p = multiprocessing.Pool(max_process) r_cmd = ('select id,content_id,pub_date,title,title_score,news_content,content_score from dyx_emotion_analysis where id = %d;' % (index)) p.apply_async(func = read_SQL_write,args=(r_host,r_port,r_user,r_passwd,r_db,r_charset,w_host,w_port,w_user,w_passwd,w_db,w_charset,r_cmd,index,)) if p: p.close() p.join()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 仙境传说新启航一区是哪个区 仙境传说一区服务器介绍
- 叶倩文2014《影视金曲》LPCD45【WAV+CUE】
- 张国荣1996-哥哥的前半生[华星]2CD[WAV]
- 银霞.1981-《泥泞中的小花·期待》台湾复刻版[WAV+CUE]
- PS掌机游玩《宇宙机器人》体验测试 玩家:这游戏就得用便携模式玩!
- 《黑神话:悟空》角色游戏内形象与86版西游记对比:这版本太经典了
- 《尘白禁区》凯茜娅泳装视频:碧海之中摇曳的少女们
- 林珊如.1997-神秘的感觉【鸿谷唱片】【WAV+CUE】
- 群星.1991-8大巨星展魅力【新丽声】【WAV+CUE】
- 群星.2021-流金岁月电视剧原声带【仁溪音乐】【FLAC分轨】
- 魔兽世界地心之战踏风武僧用什么饰品 地心之战踏风武僧饰品推荐
- 仙境传说新启航新手职业怎么选 仙境传说新手职业推荐
- 魔兽世界地心之战酒仙武僧用什么饰品 地心之战酒仙武僧饰品推荐
- 王菲.2001-《菲经典DSD》引进版[WAV+CUE]
- 【雨果唱版】民歌对唱《红英与唐彪LPCD45》2007[WAV+CUE]