解决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基础之入门必看操作
Jul 26 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
Django时区详解
Jul 24 Python
python 标准差计算的实现(std)
Jul 29 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
如何使用Python抓取网页tag操作
Feb 14 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
python else语句在循环中的运用详解
Jul 06 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
scrapy处理python爬虫调度详解
Nov 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 中dirname(_file_)讲解
2007/03/18 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
PHP SEO优化之URL优化方法
2011/04/21 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
python解决字符串倒序输出的问题
2018/06/25 Python
详解python的argpare和click模块小结
2019/03/31 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
初中生自我评价
2014/02/01 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
实习生辞职信范文
2015/03/02 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python