解决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之编写类之三子类
Oct 11 Python
用python 制作图片转pdf工具
Jan 30 Python
Python MySQLdb Linux下安装笔记
May 09 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
详解Python编程中包的概念与管理
Oct 16 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
python放大图片和画方格实现算法
Mar 30 Python
Python 如何查找特定类型文件
Aug 17 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 Python
解决Pytorch中关于model.eval的问题
May 22 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 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
php4的彩蛋
2006/10/09 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
python中的yield使用方法
2014/02/11 Python
理解python多线程(python多线程简明教程)
2014/06/09 Python
python中os操作文件及文件路径实例汇总
2015/01/15 Python
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
python re模块的高级用法详解
2018/06/06 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
py-charm延长试用期限实例
2019/12/22 Python
pytorch实现线性拟合方式
2020/01/15 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
村官学习十八大感想
2014/01/15 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
保密工作责任书
2014/04/16 职场文书
病媒生物防治方案
2014/05/13 职场文书
学术会议领导致辞
2015/07/29 职场文书
认识实习感想
2015/08/10 职场文书
升学宴家长答谢词
2015/09/29 职场文书
2016国培研修心得体会
2016/01/08 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server