解决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正则表达式re模块详解
Jun 25 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 Python
TensorFlow saver指定变量的存取
Mar 10 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
Python关于反射的实例代码分享
Feb 20 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 11 Python
Python基础 括号()[]{}的详解
Nov 07 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中神奇的fastcgi_finish_request
2011/05/02 PHP
php 团购折扣计算公式
2011/11/24 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
python批量导出导入MySQL用户的方法
2013/11/15 Python
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
详解Python3.1版本带来的核心变化
2015/04/07 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
品学兼优的大学生自我评价
2013/09/20 职场文书
大学生操行评语大全
2014/12/31 职场文书
统计员岗位职责范本
2015/04/14 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
庆元旦主持词
2015/07/06 职场文书
企业安全生产规章制度
2015/08/06 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
Nginx内网单机反向代理的实现
2021/11/07 Servers