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
Python基于贪心算法解决背包问题示例
Nov 27 Python
Pycharm更换python解释器的方法
Oct 29 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
django-allauth入门学习和使用详解
Jul 03 Python
Django REST framework 视图和路由详解
Jul 19 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
Python学习笔记之While循环用法分析
Aug 14 Python
pytorch之inception_v3的实现案例
Jan 06 Python
基于keras中的回调函数用法说明
Jun 17 Python
python excel多行合并的方法
Dec 09 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程序员工具
2008/05/26 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
Vue.js常用指令的使用小结
2017/06/23 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
python面向对象法实现图书管理系统
2019/04/19 Python
PHP统计代码行数的小代码
2019/09/19 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
python定义类的简单用法
2020/07/24 Python
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
大学生个人自荐信
2014/02/24 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
争先创优活动总结
2014/08/27 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
PO模式在selenium自动化测试框架的优势
2022/03/20 Python
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL