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使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
Python实现简单登录验证
Apr 13 Python
教你用Type Hint提高Python程序开发效率
Aug 08 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
Python 调用 Windows API COM 新法
Aug 22 Python
python对execl 处理操作代码
Jun 22 Python
django rest framework 过滤时间操作
Jul 12 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
Python中X[:,0]和X[:,1]的用法
May 10 Python
Django框架中视图的用法
Jun 10 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内置过滤器FILTER使用实例
2014/06/25 PHP
详谈PHP编码转换问题
2015/07/28 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
python在指定目录下查找gif文件的方法
2015/05/04 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
使用python制作一个解压缩软件
2019/11/13 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
数据库的约束含义
2012/09/09 面试题
幼教简历自我评价
2014/01/28 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
大专生找工作自荐书
2014/06/10 职场文书
拾金不昧感谢信
2015/01/21 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS