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 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
django 按时间范围查询数据库实例代码
Feb 11 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
tensorflow使用指定gpu的方法
Feb 04 Python
python实现udp聊天窗口
Mar 31 Python
Python数据分析之绘图和可视化详解
Jun 02 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 安全过滤函数代码
2011/05/07 PHP
php判断变量类型常用方法
2012/04/24 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
jquery each()源代码
2011/02/14 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python中的高级函数map/reduce使用实例
2015/04/13 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python3 map函数和filter函数详解
2019/08/26 Python
Django配置文件代码说明
2019/12/04 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
销售个人求职信范文
2014/04/28 职场文书
大学新闻系自荐书
2014/05/31 职场文书
员工安全生产责任书
2014/07/22 职场文书
学习十八大标语
2014/10/09 职场文书