应用场景:本人需要对200万条网页html格式数据进行清洗,提取文字后将分词结果写入数据库,之前做了一次,大概花费了80多个小时才跑完。机器配置是4核,内存8G;开完会领导让再改点东西重新跑一遍,然后说用多进程或...
应用场景:本人需要对200万条网页html格式数据进行清洗,提取文字后将分词结果写入数据库,之前做了一次,大概花费了80多个小时才跑完。机器配置是4核,内存8G;开完会领导让再改点东西重新跑一遍,然后说用多进程或者多线程跑,速度快。
本人接触python不到两个月,以前也基本不怎么编程,所以这种优化什么的东西都不懂,只好求助同事。同事告诉我直接看廖雪峰的教程就ok了。先看了一下廖雪峰写的单个进程代码,比较容易懂,但是我需要开四个进程,把我的cpu都占满来跑,这样效率才最大。
所以又看了多进程的例子,并自己实践了一下:
from multiprocessing import Process import os from multiprocessing import Pool def run_proc(i): a=i*3 print(a) if __name__=='__main__': p = Pool(4) for i in range(5): p.apply_async(run_proc, args=(i,)) p.close() p.join()
看一下上面代码,Pool代表的是一个进程池,里面写几就代表你想跑几个进程,但是你的cpu是几核你就只能开几个进程,而且进程数最好是2的整数倍(同事告诉我的)。查看cpu核数的方法就是打开任务管理器,然后性能里面有几个小窗口就代表几核。
我的是四个小窗口,代表四核。按照上面的例子我用四个核来计算run_proc这个函数,然后每个核计算的是一个i值对应的run_proc函数。
接下来到我的实际场景中,我是想从数据库中读取200万条数据并对所有数据进行一系列操作后再写如数据库,这里我采用四核全跑,每个核分配50万数据来进行:
start = datetime.datetime.now() p = Pool(4) # 建立进程池 get_data_cmd=['SELECT * FROM 标讯样本_二百万 limit 0,500000', 'SELECT * FROM 标讯样本_二百万 limit 500000,500000', 'SELECT * FROM 标讯样本_二百万 limit 1000000,500000', 'SELECT * FROM 标讯样本_二百万 limit 1500000,500000' ] for cmd in get_data_cmd: # 将每个命令传入不同的子进程执行相同的代码 p.apply_async(con_seg_word, args=(cmd,)) p.close() p.join()
我的方法比较笨,就是将四个不同的sql命令放在一个列表中,然后循环读取列表中的语句来分配给每个核要跑的函数,这样就ok了,时间大约比之前少了4倍吧。
apply_async这个方法就是你要将你的这四个sql命令给哪个函数,其中arg就是要传递进函数的参数。
本文标题为:用了python多进程,我跑程序花费的时间缩短了4倍
- windows安装python2.7.12和pycharm2018教程 2023-09-03
- Python 保存数据的方法(4种方法) 2023-09-04
- Python Pandas如何获取和修改任意位置的值(at,iat,loc,iloc) 2023-08-04
- Python实现将DNA序列存储为tfr文件并读取流程介绍 2022-10-20
- python中defaultdict用法实例详解 2022-10-20
- CentOS7 安装 Python3.6 2023-09-04
- Python之路-Python中的线程与进程 2023-09-04
- 在centos6.4下安装python3.5 2023-09-04
- python线程池ThreadPoolExecutor与进程池ProcessPoolExecutor 2023-09-04
- python中列表添加元素的几种方式(+、append()、ext 2022-09-02