Python实现数据库并行读取和写入实例


Posted in Python onJune 09, 2017

这篇主要记录一下如何实现对数据库的并行运算来节省代码运行时间。语言是Python,其他语言思路一样。

前言

一共23w条数据,是之前通过自然语言分析处理过的数据,附一张截图:

Python实现数据库并行读取和写入实例

要实现对news主体的读取,并且找到其中含有的股票名称,只要发现,就将这支股票和对应的日期、score写入数据库。

显然,几十万条数据要是一条条读写,然后在本机上操作,耗时太久,可行性极低。所以,如何有效并行的读取内容,并且进行操作,最后再写入数据库呢?

并行读取和写入

并行读取:创建N*max_process个进程,对数据库进行读取。读取的时候应该注意:

  1. 每个进程需要分配不同的connection和对应的cursor,否则数据库会报错。
  2. 数据库必须能承受相应的高并发访问(可以手动更改)

实现的时候,如果不在进程里面创建新的connection,就会发生冲突,每个进程拿到权限后,会被下个进程释放,所以汇报出来NoneType Error的错误。

  1. 并行写入:在对数据库进行更改的时候,不可以多进程更改。所以,我们需要根据已有的表,创建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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python命名空间详解
Aug 18 Python
Python制作词云的方法
Jan 03 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
Jan 02 Python
python实现图书借阅系统
Feb 20 Python
Python创建或生成列表的操作方法
Jun 19 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
详解python之多进程和进程池(Processing库)
Jun 09 #Python
Python使用django搭建web开发环境
Jun 09 #Python
Python实现删除文件中含“指定内容”的行示例
Jun 09 #Python
Python实现两个list对应元素相减操作示例
Jun 09 #Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 #Python
python爬虫框架talonspider简单介绍
Jun 09 #Python
python实现list元素按关键字相加减的方法示例
Jun 09 #Python
You might like
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
Python创建文件和追加文件内容实例
2014/10/21 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
会计岗位职责
2013/11/08 职场文书
环境整治工作方案
2014/05/18 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
教学督导岗位职责
2015/04/10 职场文书
社区敬老月活动总结
2015/05/07 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL
Python函数式编程中itertools模块详解
2021/09/15 Python
防止web项目中的SQL注入
2021/12/06 MySQL
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
Java中的Kotlin 内部类原理
2022/06/16 Java/Android