解决python存数据库速度太慢的问题


Posted in Python onApril 23, 2021

在项目中遇到一个问题,需要从文本中读取三万条数据写入mysql数据库,文件中为用@分割的sql语句,但是在读取的过程中发现速度过慢,三万八千条数据需要220秒,问题代码片段如下:

def read_to_mysql(filecata, targetDir):
 '''
 用来写入数据库,写入后会剪贴掉文件
 filecata 为保存有文件地址的list,已去掉尾部的空格
 :param filecata: 文件目录
 :param targetDir: 要复制的目标目录
 :return:
 '''
 root_dir = os.path.abspath(os.path.join(os.getcwd(), "./"))
 config = configparser.ConfigParser()
 config.read(root_dir + "/config.ini")
 __host = config.get("DatabaseOfWRT", "host")
 __database_name = config.get("DatabaseOfWRT", "database")
 __user_name = config.get("DatabaseOfWRT", "username")
 __user_passwaord = config.get("DatabaseOfWRT", "password")
 __charset = config.get("DatabaseOfWRT", "charset")
 conn = pymysql.connect(
  host=__host,
  user=__user_name, password=__user_passwaord,
  database=__database_name,
  charset=__charset
 )
 cursor = conn.cursor()
 with open(filecata, "r", encoding='utf-8') as f:
  data = f.read() # 读取文件
  data_list = data.split('@')
  del data_list[-1]
  starttime = int(time.time())
  for data_str in data_list:
   data_str = str(data_str)
   sql = data_str + ';'
   cursor.execute(sql)
   conn.commit()
   print(flag)
 copy_del_file(filecata, targetDir) # 用来剪切的函数,此处不影响,因而省略
 cursor.close()
 conn.close()

经测试发现,影响速度的主要原因是commit(),因为没过几秒提交一次即可,但是因为提交的字符长度有限制,所以要设置一个合理的时间读取,代码修改如下:

def read_to_mysql(filecata, targetDir):
 '''
 用来写入数据库,写入后会剪贴掉文件
 filecata 为保存有文件地址的list,已去掉尾部的空格
 :param filecata:
 :param targetDir: 要复制的目标目录
 :return:
 '''
 root_dir = os.path.abspath(os.path.join(os.getcwd(), "./"))
 config = configparser.ConfigParser()
 config.read(root_dir + "/config.ini")
 __host = config.get("DatabaseOfWRT", "host")
 __database_name = config.get("DatabaseOfWRT", "database")
 __user_name = config.get("DatabaseOfWRT", "username")
 __user_passwaord = config.get("DatabaseOfWRT", "password")
 __charset = config.get("DatabaseOfWRT", "charset")
 conn = pymysql.connect(
  host=__host,
  user=__user_name, password=__user_passwaord,
  database=__database_name,
  charset=__charset
 )
 cursor = conn.cursor()
 with open(filecata, "r", encoding='utf-8') as f:
  data = f.read() # 读取文件
  data_list = data.split('@')
  del data_list[-1]
  starttime = int(time.time())
  for data_str in data_list:
   endtime = int(time.time())
   data_str = str(data_str)
   sql = data_str + ';'
   cursor.execute(sql)
   if endtime - starttime ==10: # 每过十秒提交一次
    starttime = int(time.time())
    conn.commit()
 conn.commit()
 copy_del_file(filecata, targetDir)
 cursor.close()
 conn.close()
 return flag

此时写入三万八千条数据需要9秒

补充:python 连数据库cursur.fetchall ()速度慢的解决方案

解决游标遍历慢的方法:

一行一行去遍历,而不是一下全部读取出来

将cursur.fetchall()更改为for i in cursur:

补充:python 读取文件时速度的问题

"""举例 读取文件"""
# 第一种方式
with open('test.txt', 'r', encoding='utf-8') as f:
 info = f.readlines()
 for line in info:
 pass
# 第二种方式
with open('test.txt', 'r', encoding='utf-8') as f:
 for line in f:
 pass

对于以上两种方式读取文件,各自有各自的用途,当用两种方式都可以时,第二种方式的效率是第一种的几个量级, readlines()将文件内容读取到内存的list中,操作虽然方便,但是消耗内存,运行效率慢。

原生的f是将文件内容读到生成器中, 当需要操作时,从生成器中循环出来,速度很快,操作大文件时建议用第二种方式!

Python 相关文章推荐
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
python中__slots__用法实例
Jun 04 Python
python中的set实现不重复的排序原理
Jan 24 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
Python批量生成特定尺寸图片及图画任意文字的实例
Jan 30 Python
Django 用户认证组件使用详解
Jul 23 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
Python实现的微信红包提醒功能示例
Aug 22 Python
详解python中docx库的安装过程
Nov 08 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 Python
python实战之90行代码写个猜数字游戏
Apr 22 #Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 #Python
python 破解加密zip文件的密码
python入门之算法学习
Apr 22 #Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 #Python
python 实现德洛内三角剖分的操作
python 三边测量定位的实现代码
You might like
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
软件测试题目
2013/02/27 面试题
社会治安综合治理管理责任书
2014/04/16 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
美术课外活动总结
2014/07/08 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
感恩主题班会教案
2015/08/12 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL