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和JavaScript间代码转换的4个工具
Feb 22 Python
Python生成短uuid的方法实例详解
May 29 Python
matplotlib给子图添加图例的方法
Aug 03 Python
python实现简单flappy bird
Dec 24 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
python实现扫描ip地址的小程序
Apr 16 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
最小二乘法及其python实现详解
Feb 24 Python
520使用Python实现“我爱你”表白
May 20 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 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
解决中英文字符串长度问题函数
2007/01/16 PHP
php画图实例
2014/11/05 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
PyQT实现多窗口切换
2018/04/20 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Python使用贪婪算法解决问题
2019/10/22 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
美国眼镜网:GlassesUSA
2017/09/07 全球购物
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
大学校庆策划书
2014/01/31 职场文书
中学生打架检讨书
2014/02/10 职场文书
入党自荐书范文
2014/03/09 职场文书
导航工程专业自荐信
2014/09/02 职场文书
鲁迅故里导游词
2015/02/05 职场文书
入党介绍人考察意见
2015/06/01 职场文书
Python上下文管理器Content Manager
2021/06/26 Python
MySQL分区表实现按月份归类
2021/11/01 MySQL
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL