解决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基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
python PrettyTable模块的安装与简单应用
Jan 11 Python
Python调用百度根据经纬度查询地址的示例代码
Jul 07 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
Python基础教程,Python入门教程(超详细)
Jun 24 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
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
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php遍历CSV类实例
2015/04/14 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
php之可变函数的实例详解
2017/09/13 PHP
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
Python 含参构造函数实例详解
2017/05/25 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
python实现上传下载文件功能
2020/11/19 Python
Python numpy 常用函数总结
2017/12/07 Python
微信跳一跳python代码实现
2018/01/05 Python
简单实现python画圆功能
2018/01/25 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
草莓网官网:StrawberryNET
2019/08/21 全球购物
单位消防安全制度
2014/01/12 职场文书
高三高考决心书
2014/03/11 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
大二学生自我检讨书
2014/10/23 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书