解决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中的自定义函数学习笔记
Sep 23 Python
python实现的用于搜索文件并进行内容替换的类实例
Jun 28 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
python字符串反转的四种方法详解
Dec 02 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
通过实例了解Python异常处理机制底层实现
Jul 23 Python
python如何利用cv2模块读取显示保存图片
Jun 04 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
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python获取图片颜色信息的方法
2015/03/18 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
python中图像通道分离与合并实例
2020/01/17 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
园长自我鉴定
2013/10/06 职场文书
大学生应聘自荐信
2013/10/11 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
安全生产年活动总结
2014/08/29 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
办公用房租赁协议书
2014/11/29 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
解决numpy和torch数据类型转化的问题
2021/05/23 Python