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素数检测实例分析
Jun 15 Python
使用Python写CUDA程序的方法
Mar 27 Python
pandas值替换方法
Jul 10 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
浅谈Python中的模块
Jun 10 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 Python
python中数组和列表的简单实例
Mar 25 Python
python 实现图片特效处理
Apr 03 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
微信小程序 出现错误:{"baseresponse":{"errcode":-80002,"errmsg":""}}解决办法
2017/02/23 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
给导游的表扬信
2014/01/10 职场文书
七年级地理教学反思
2014/01/26 职场文书
2014年绿化工作总结
2014/12/09 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
财务管理制度范本
2015/08/04 职场文书