解决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 相关文章推荐
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
Python中的装饰器用法详解
Jan 14 Python
python实现挑选出来100以内的质数
Mar 24 Python
用Python实现换行符转换的脚本的教程
Apr 16 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
学习python可以干什么
Feb 26 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
python调用API接口实现登陆短信验证
May 10 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
Python 阶乘详解
Oct 05 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
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
js简单时间比较的方法
2016/08/02 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
JS前端笔试题分析
2016/12/19 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
Python2中的raw_input() 与 input()
2015/06/12 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
python3.6编写的单元测试示例
2019/08/17 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
公司承诺书怎么写
2014/05/24 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
家长会后的感想
2015/08/11 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server