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字符串转换成浮点数函数分享
Jul 24 Python
python使用turtle库绘制时钟
Mar 25 Python
python使用suds调用webservice接口的方法
Jan 03 Python
详解python的四种内置数据结构
Mar 19 Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
python的scipy实现插值的示例代码
Nov 12 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
Python3读写ini配置文件的示例
Nov 06 Python
Python3中FuzzyWuzzy库实例用法
Nov 18 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中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
var与Javascript变量隐式声明
2009/09/17 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
Python创建模块及模块导入的方法
2015/05/27 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
Python实现数字的格式化输出
2020/08/01 Python
python字典按照value排序方法
2020/12/28 Python
红领巾心向党广播稿
2014/01/19 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
电力安全事故反思
2014/04/27 职场文书
大跃进口号
2014/06/16 职场文书
出租房屋协议书
2014/09/14 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
领导欢迎词范文
2015/01/26 职场文书
《检阅》教学反思
2016/02/22 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
Win2008系统搭建DHCP服务器
2022/06/25 Servers
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL