解决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中操作字典之clear()方法的使用
May 21 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
Django自定义用户认证示例详解
Mar 14 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
python 执行shell命令并将结果保存的实例
May 11 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 Python
python中单下划线_的常见用法总结
Jul 10 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
python操作cfg配置文件方式
Dec 22 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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里面的抽象类
2010/01/28 PHP
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
浅谈PHP封装CURL
2019/03/06 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python web基础之加载静态文件实例
2018/03/20 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
navabi英国:设计师大码女装
2019/06/25 全球购物
六一儿童节主持词
2014/03/21 职场文书
新闻编辑求职信
2014/04/09 职场文书
汽车广告策划方案
2014/05/31 职场文书
三方股东合作协议书
2014/10/28 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
微信搭讪开场白
2015/05/28 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
Python MNIST手写体识别详解与试练
2021/11/07 Python
css3 文字断裂效果
2022/04/22 HTML / CSS