解决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基于二分查找实现求整数平方根的方法
May 12 Python
python 文件操作api(文件操作函数)
Aug 28 Python
谈谈如何手动释放Python的内存
Dec 17 Python
python实现下载文件的三种方法
Feb 09 Python
python 网络编程详解及简单实例
Apr 25 Python
python2.7安装图文教程
Mar 13 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
python无序链表删除重复项的方法
Jan 17 Python
详解Python的三种拷贝方式
Feb 11 Python
Django模型验证器介绍与源码分析
Sep 08 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 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脚本的10个技巧(2)
2006/10/09 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
python调用java的Webservice示例
2014/03/10 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
美术专业学生个人自我评价
2013/09/19 职场文书
最新销售员个人自荐信
2013/09/21 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
青春无悔演讲稿
2014/05/08 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
孔庙导游词
2015/02/04 职场文书
党支部鉴定意见
2015/06/02 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
Python实现列表拼接和去重的三种方式
2021/07/02 Python
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android