Python实战(6)单线程和多线程导入mysql数据对比测试
单线程脚本
导入文件的行数
# wc -l /data/logs/testlog/20120219/testlog1/*
1510503 total
- # -*- coding: utf-8 -*-
- #!/usr/bin/env python
- #create database pythondata
- #create table log (logline varchar(500));
- #grant all on pythondata.* to 'pyuser'@'localhost' identified by "pypasswd";
- import MySQLdb
- import os
- import time
- def writeLinestoDb(sql,content):
- conn=MySQLdb.connect(host="localhost",user="pyuser",passwd="pypasswd",db="pythondata")
- cur =conn.cursor()
- cur.executemany(sql,content)
- cur.close()
- conn.commit()
- conn.close()
- def readLinestoList(path):
- alllines=[]
- for file in os.listdir(path):
- files=os.path.join(path,file)
- for line in open(files):
- alllines.append(line)
- return alllines
- def main():
- insertsql ="INSERT INTO log(logline) VALUES(%s)"
- alllines=readLinestoList('/data/logs/testlog/20120219/testlog1')
- for line in alllines:
- content=line.strip()
- print content
- writeLinestoDb(insertsql,content)
- time.sleep(10)
- if __name__=="__main__":
- print('starting at:',time.ctime())
- main()
- print('ending at:',time.ctime())
('starting at:', 'Tue Mar 27 11:09:20 2012')
('ending at:', 'Tue Mar 27 11:13:20 2012')
耗时4分钟
mysql> select count(*) from log ;
+----------+
| count(*) |
+----------+
| 1510551 |
+----------+
多线程脚本
- # -*- coding: utf-8 -*-
- #!/usr/bin/env python
- import MySQLdb
- import os
- from time import ctime
- from threading import Thread
- from Queue import Queue
- in_num_thread=10
- out_num_thread=10
- in_queue=Queue()
- out_queue=Queue()
- def listDir(path):
- for filename in os.listdir(path):
- in_queue.put(os.path.join(path,filename))
- def readFile(iq,in_queue):
- filelines=[]
- while True:
- file=in_queue.get()
- for line in open(file):
- filelines.append(line)
- out_queue.put(filelines)
- in_queue.task_done()
- def writeLinestoDb(oq,out_queue):
- sql=insertsql ="INSERT INTO log(logline) VALUES(%s)"
- while True:
- content=out_queue.get()
- conn=MySQLdb.connect(host="localhost",user="pyuser",passwd="pypasswd",db="pythondata")
- cur =conn.cursor()
- cur.executemany(sql,content)
- cur.close()
- conn.commit()
- conn.close()
- out_queue.task_done()
- def main():
- listDir('/data/logs/testlog/20120219/testlog1')
- for iq in range(in_num_thread):
- worker=Thread(target=readFile,args(iq,in_queue))
- worker.setDaemon(True)
- worker.start()
- print "Readfile Main Thread Waiting at",ctime()
- in_queue.join()
- print "Readfile Done at,",ctime()
- for oq in range(out_num_thread):
- worker=Thread(target=writeLinestoDb,args(oq,out_queue))
- worker.setDaemon(True)
- worker.start()
- print "Insert into mysql Main Thread at",ctime()
- out_queue.join()
- print "Insert into mysql at,",ctime()
- if __name__=="__main__":
- print('starting at:',time.ctime())
- main()
- print('ending at:',time.ctime())
- 数据库位于本机
- ('starting at:', 'Tue Mar 27 10:57:01 2012')
Readfile Main Thread Waiting at Tue Mar 27 10:57:01 2012
Readfile Done at, Tue Mar 27 10:57:04 2012
Insert into mysql Main Thread at Tue Mar 27 10:57:04 2012
Insert into mysql at, Tue Mar 27 11:03:34 2012
('ending at:', 'Tue Mar 27 11:03:34 2012')
mysql> select count(*) from log ;
+----------+
| count(*) |
+----------+
| 3676015 |
+----------+ - 两次个数据不一致,多线的导入有问题。
服务器配置4G8核,mysql本地 两个脚本在同一台机器上运行
多线程脚本改进
- #!/usr/bin/env python
- #create table log ( logline varchar(300));
- #grant all on pythondata.* to 'pyuser'@'localhost' identified by "pypasswd"
- import MySQLdb
- import os
- import sys
- from time import ctime
- from threading import Thread
- from Queue import Queue
- num_thread=10
- queue=Queue()
- def listDir(path):
- file_list=[]
- for filename in os.listdir(path):
- file_list.append(os.path.join(path,filename))
- return file_list
- def readFile(file):
- alllines=[]
- for line in open(file):
- alllines.append(line)
- return alllines
- def writeLinestoDb(q,queue):
- sql=insertsql ="INSERT INTO log(logline) VALUES(%s)"
- while True:
- content=queue.get()
- conn=MySQLdb.connect(host="localhost",user="pyuser",passwd="pypasswd",db="pythondata")
- cur =conn.cursor()
- cur.executemany(sql,content)
- cur.close()
- conn.commit()
- conn.close()
- queue.task_done()
- def main():
- print "Readfile Start at,",ctime()
- for file in listDir('/data/logs/testlog/20120219/testlog1'):
- queue.put(readFile(file))
- print "Readfile Done at,",ctime()
- for q in range(num_thread):
- worker=Thread(target=writeLinestoDb,args=(q,queue))
- worker.setDaemon(True)
- worker.start()
- print "Insert into mysql Main Thread at",ctime()
- queue.join()
- print "Insert into mysql at,",ctime()
- if __name__=="__main__":
- print('starting at:',ctime())
- main()
- print('ending at:',ctime())
结果
('starting at:', 'Tue Mar 27 14:32:05 2012')
Readfile Start at, Tue Mar 27 14:32:05 2012
Readfile Done at, Tue Mar 27 14:32:07 2012
Insert into mysql Main Thread at Tue Mar 27 14:32:08 2012
Insert into mysql at, Tue Mar 27 14:34:31 2012
('ending at:', 'Tue Mar 27 14:34:31 2012')
mysql> select count(*) from log;
+----------+
| count(*) |
+----------+
| 1510551 |
+----------+
读用了2秒中,插入使用2分23秒
第一个多线程脚本错误的原因是传入队列的数据问题。 还有一个问题,读的文件超过物理内存和虚拟内存的总量,会造成内存溢出程序挂掉,解决办法每次读取指定行
Python实战(6)单线程和多线程导入mysql数据对比测试的更多相关文章
- Sqoop导入mysql数据到Hbase
sqoop import --driver com.mysql.jdbc.Driver --connect "jdbc:mysql://11.143.18.29:3306/db_1" ...
- solr7.4创建core,导入MySQL数据,中文分词
#solr版本:7.4.0 一.新建Core 进入安装目录下得server/solr/,创建一个文件夹,如:new_core 拷贝server/solr/configsets/_default/con ...
- 【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中
最近有一个将 mysql 数据导入到 MongoDB 中的需求,打算使用 Kettle 工具实现.本文章记录了数据导入从0到1的过程,最终实现了每秒钟快速导入约 1200 条数据.一起来看吧~ 一.K ...
- 如何导出和导入mysql数据(数据迁移)
. 导出数据库数据 mysqldump -uroot -p dp_db > dumpout.sql 其中 root是账户名 dp_db是需要导出的数据库名称 dumpout.sql存储导出的数据 ...
- HeidiSQL工具导出导入MySQL数据
有时候,为了数据方便导出导入SQL,我们可以借助一定的工具,方便我们队数据库的移植,可以达到事半功倍的效果.在这里,就给大家简单的介绍一款能方便导出或者导入MySQL的数据. ①首先,选择你要导出的数 ...
- excel导入mysql数据
excel加载mysql数据 1.第一步,选择从mysql导入数据 2.单击会出现弹框: 3.可能有的同学的,这里缺少插件,例如: 4.去下载 这个 插件安装即可.https://dev.mysql. ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- python将Excel文件内容导入Mysql数据
为了方便起见,将所有字段类型设置为str,理解mysql的语法这个玩意贼简单 # _*_ coding:utf-8 _*_import pandas as pd #先装个pandas ,pip ins ...
- 命令行导入mysql数据
找到mysql安装目录(bin) 进入mysql mysql -u root -p 123 选中数据库 use 数据库名 导入sql source sql数据库路径
随机推荐
- [转载]PT建站源码(PT服务器原程序)汇总(20100815更新)
Tbsource官方网站(已失效):http://www.tbsource.com/下载地址:http://www.ipv6bbs.com/thread-5152-1-1.html使用站点:CCFbi ...
- Android Hook框架adbi源码浅析(二)
二.libbase 其实上面加载完SO库后,hook的功能我们完全可以自己在动态库中实现.而adbi作者为了方便我们使用,编写了一个通用的hook框架工具即libbase库.libbase依然在解决两 ...
- 无重复字符的最长子串-LeetCode-第3题-C++
题目:无重复字符的最长子串 题目描述:给定一个字符串,找出不含有重复字符的最长子串的长度. 最长不重复子串可能有很多个,但是其长度只有一种. 方法一:暴力搜索法 方法二:滑动窗口 哈希表:要查找一个元 ...
- Python之路,第二十篇:Python入门与基础20
python3 面向对象4 supper 函数 supper(type, obj) 返回绑定超类的实例(要求obj必须为type类型的实例) supper() 返回绑定的超类的实例,等同于(cl ...
- 基于Hexo+Node.js+github+coding搭建个人博客——基础篇
附上个人教程:http://www.ookamiantd.top/2017/build-blog-hexo-base/ 搭建此博客的动机以及好处在此就不多谈了,之前已经表达过,详情请看Start My ...
- oracle 数据库备份、还原、和使用心得(表丢失、视图丢失的解决办法)
一.oracle数据备份:exp 关键字 说明(默认值) 关键字 说明(默认值) --------------------------------- ...
- hdu3605 Escape 二分图多重匹配/最大流
2012 If this is the end of the world how to do? I do not know how. But now scientists have found tha ...
- 小白python 安装
小白python 安装: https://blog.csdn.net/qq_36667170/article/details/79275605 https://blog.csdn.net/nmjuzi ...
- Go Example--工作池
package main import ( "fmt" "time" ) func main() { jobs :=make(chan int,100) res ...
- codeforce 804B Minimum number of steps
cf劲啊 原题: We have a string of letters 'a' and 'b'. We want to perform some operations on it. On each ...