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设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
python3操作微信itchat实现发送图片
Feb 24 Python
python实现五子棋小程序
Jun 18 Python
Python 中Django验证码功能的实现代码
Jun 20 Python
对Python函数设计规范详解
Jul 19 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
python3 字符串知识点学习笔记
Feb 08 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
使用python实现名片管理系统
Jun 18 Python
python 装饰器重要在哪
Feb 14 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
Python实现视频自动打码的示例代码
Apr 08 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
php目录拷贝实现方法
2015/07/10 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
php实现记事本案例
2020/10/20 PHP
JavaScript学习笔记之基础语法
2015/01/22 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
Vue.js数据绑定之data属性
2017/07/07 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
python按照多个条件排序的方法
2019/02/08 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
python统计字符的个数代码实例
2020/02/07 Python
Keras 使用 Lambda层详解
2020/06/10 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
如何利用Python 进行边缘检测
2020/10/14 Python
python中Mako库实例用法
2020/12/31 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
构造器Constructor是否可被override?
2013/08/06 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
财务总经理岗位职责
2014/02/16 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
平安家庭事迹材料
2014/12/20 职场文书
2015年领班工作总结
2015/04/29 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers