解决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操作MySQL简单实现方法
Jan 26 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
使用Python求解最大公约数的实现方法
Aug 20 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
python调用百度REST API实现语音识别
Aug 30 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
Python如何重新加载模块
Jul 29 Python
python speech模块的使用方法
Sep 09 Python
python中@property的作用和getter setter的解释
Dec 22 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
7个超级实用的PHP代码片段
2011/07/11 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
python PyTorch预训练示例
2018/02/11 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
python求解汉诺塔游戏
2020/07/09 Python
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
Ajax的优点和缺点
2014/11/21 面试题
技校毕业生自荐信范文
2014/03/07 职场文书
毕业自我鉴定书
2014/03/24 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
企业管理标语
2014/06/10 职场文书
车间核算员岗位职责
2014/07/01 职场文书
结婚通知短信大全
2015/04/17 职场文书
七年级数学教学反思
2016/02/17 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL