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 相关文章推荐
详解Django通用视图中的函数包装
Jul 21 Python
Python中return语句用法实例分析
Aug 04 Python
python中enumerate函数遍历元素用法分析
Mar 11 Python
简单了解Django模板的使用
Dec 20 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
Python TestCase中的断言方法介绍
May 02 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
python系列 文件操作的代码
Oct 06 Python
python创建子类的方法分析
Nov 28 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 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
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
PHP实现下载功能的代码
2012/09/29 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python统计文章中单词出现次数实例
2020/02/27 Python
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
庆祝教师节演讲稿
2014/09/03 职场文书
期末复习计划
2015/01/19 职场文书
员工辞退通知书
2015/04/17 职场文书
党员承诺书范文2015
2015/04/27 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
全民创业工作总结
2015/08/13 职场文书
计算机实训心得体会
2016/01/14 职场文书
护理心得体会范文
2016/01/22 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书