解决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使用循环实现批量创建文件夹示例
Mar 25 Python
python实现基本进制转换的方法
Jul 11 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python实现的密码强度检测器示例
Aug 23 Python
python实现BackPropagation算法
Dec 14 Python
Python中join函数简单代码示例
Jan 09 Python
利用Python如何生成便签图片详解
Jul 09 Python
Django的Modelforms用法简介
Jul 27 Python
python 元组的使用方法
Jun 09 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 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
mysql 字段类型说明
2007/04/27 PHP
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python AES加密模块用法分析
2017/05/22 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python实现俄罗斯方块
2018/06/26 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
python实现一个简单的ping工具方法
2019/01/31 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
彻底解决Python包下载慢问题
2020/11/15 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
车辆安全检查制度
2014/01/12 职场文书
1亿有多大教学反思
2014/05/01 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
Python中基础数据类型 set集合知识点总结
2021/08/02 Python