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 图片验证码代码
Dec 07 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
python网络编程之数据传输UDP实例分析
May 20 Python
Python实现删除文件但保留指定文件
Jun 21 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
基于python socketserver框架全面解析
Sep 21 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
python使用turtle库绘制奥运五环
Feb 24 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
用Python创建简易网站图文教程
Jun 11 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时间戳转换的示例
2014/03/31 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
javascript中xml操作实现代码
2011/11/21 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
python使用json序列化datetime类型实例解析
2018/02/11 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
全球性的在线商店:Vogca
2019/05/10 全球购物
小车司机岗位职责
2013/11/25 职场文书
《雪儿》教学反思
2014/04/17 职场文书
安全协议书
2014/04/23 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
骨干教师事迹材料
2014/12/17 职场文书
先进个人材料怎么写
2014/12/30 职场文书
鸡毛信观后感
2015/06/11 职场文书
小学运动会宣传稿
2015/07/23 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
Django实现翻页的示例代码
2021/05/24 Python
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS