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简单生成随机数的方法示例
Mar 31 Python
Python内存读写操作示例
Jul 18 Python
解析Python的缩进规则的使用
Jan 16 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
python可视化爬虫界面之天气查询
Jul 03 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
Python中的整除和取模实例
Jun 03 Python
python实现自动化群控的步骤
Apr 11 Python
利用python做表格数据处理
Apr 13 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
php将12小时制转换成24小时制的方法
2015/03/31 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
分享vim python缩进等一些配置
2018/07/02 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
python time()的实例用法
2020/11/03 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
杠杆的科学教学反思
2014/01/10 职场文书
孝老爱亲模范事迹
2014/01/24 职场文书
工作过失检讨书
2014/02/23 职场文书
法制宣传实施方案
2014/03/13 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang