解决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新手实现2048小游戏
Mar 31 Python
python Django批量导入不重复数据
Mar 25 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
Python函数式编程
Jul 20 Python
Python_LDA实现方法详解
Oct 25 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python 2.6.6升级到Python2.7.15的详细步骤
Dec 14 Python
Python使用openpyxl复制整张sheet
Mar 24 Python
Python词云的正确实现方法实例
May 08 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 变量类型的强制转换
2009/10/23 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
php异常处理方法实例汇总
2015/06/24 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
Expandable "Detail" Table Rows
2007/08/29 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
js this 绑定机制深入详解
2020/04/30 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
python生成日历实例解析
2014/08/21 Python
Python中使用item()方法遍历字典的例子
2014/08/26 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
浅析Python中的多条件排序实现
2016/06/07 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
python实现决策树分类(2)
2018/08/30 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
Python底层封装实现方法详解
2020/01/22 Python
软件工程师面试题
2012/06/25 面试题
主办会计岗位职责
2014/03/13 职场文书
动物科学专业求职信
2014/07/27 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
2015年仓库工作总结
2015/04/09 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android