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构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
Python中处理unchecked未捕获异常实例
Jan 17 Python
python动态参数用法实例分析
May 25 Python
Python松散正则表达式用法分析
Apr 29 Python
python实现发送邮件及附件功能
Mar 02 Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 Python
python中的json总结
Oct 11 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
Python中常用的8种字符串操作方法
May 06 Python
Python csv文件的读写操作实例详解
Nov 19 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 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 flush类输出缓冲剖析
2008/10/19 PHP
php购物网站支付paypal使用方法
2010/11/28 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
读jQuery之二(两种扩展)
2011/06/11 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
python difflib模块示例讲解
2017/09/13 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
python 并发下载器实现方法示例
2019/11/22 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
迎国庆演讲稿
2014/09/15 职场文书
市场营销工作计划书
2014/09/15 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android