python多进程中的内存复制(实例讲解)


Posted in Python onJanuary 05, 2018

比较好奇python对于多进程中copy on write机制的实际使用情况。目前从实验结果来看,python 使用multiprocessing来创建多进程时,无论数据是否不会被更改,子进程都会复制父进程的状态(内存空间数据等)。所以如果主进程耗的资源较多时,不小心就会造成不必要的大量的内存复制,从而可能导致内存爆满的情况。

示例

举个例子,假设主进程读取了一个大文件对象的所有行,然后通过multiprocessing创建工作进程,并循环地将每一行数据交给工作进程来处理:

def parse_lines(args):
 #working
 ...
def main_logic():
 f = open(filename , 'r')
 lines = f.readlines()
 f.close()
 pool = multiprocessing.Pool(processes==4)
 rel = pool.map(parse_lines , itertools.izip(lines , itertools.repeat(second_args)) , int(len(lines)/4))
 pool.close()
 pool.join()

以下是top及ps结果:

python多进程中的内存复制(实例讲解)

(四个子进程)

python多进程中的内存复制(实例讲解)

(父进程及四个子进程)

由上两张图可以看出父进程及子进程都各自占用了1.4G左右的内存空间。而大部分内存空间存储的是读数据lines,所以这样的内存开销太浪费。

优化计划

1: 在主进程初期未导入大量的py库之前创建进程,或者动态加载py库。

2:通过内存共享来减少内存的开销。

3: 主进程不再读取文件对象,交给每个工作进程去读取文件中的相应部分。

改进代码:

def line_count(file_name):
 count = -1 #让空文件的行号显示0
 for count,line in enumerate(open(file_name)): pass
 #enumerate格式化成了元组,count就是行号,因为从0开始要+1
 return count+1
def parse_lines(args):
 f = open(args[0] , 'r')
 lines = f.readlines()[args[1]:args[2]] #read some lines
 f.close() 
 #working
def main_logic(filename,process_num):
 line_count = line_count(filename)
 avg_len = int(line_count/process_num)
 left_cnt = line_count%process_num;
 pool = multiprocessing.Pool(processes=process_num)
 for i in xrange(0,process_num):
  ext_cnt = (i>=process_num-1 and [left_cnt] or [0])[0]
  st_line = i*avg_len
  pool.apply_async(parse_lines, ((filename, st_line, st_line+avg_len+ext_cnt),)) #指定进程读某几行数据
 pool.close()
 pool.join()

再次用top或者ps来查看进程的内存使用情况:

python多进程中的内存复制(实例讲解)

(四个子进程)

python多进程中的内存复制(实例讲解)

(父进程及四个子进程)

小结

对比两次的内存使用情况,改进代码后父进程及子进程所占用的内存明显减少;所有内存占用相当于原来的一半,这就是减少内存复制的效果。

关于内存使用这方面还有不少优化方法和空间,稍后继续研究。

以上这篇python多进程中的内存复制(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python删除文件示例分享
Jan 28 Python
python使用urlparse分析网址中域名的方法
Apr 15 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
python实现两个文件合并功能
Apr 01 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
python微信撤回监测代码
Apr 29 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
浅谈Python协程
Jun 17 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
Python pyecharts绘制条形图详解
Apr 02 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 #Python
Python3多线程爬虫实例讲解代码
Jan 05 #Python
python编写微信远程控制电脑的程序
Jan 05 #Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 #Python
简单实现python收发邮件功能
Jan 05 #Python
5款非常棒的Python工具
Jan 05 #Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 #Python
You might like
十天学会php(2)
2006/10/09 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
python定时器使用示例分享
2014/02/16 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
Python抽象类的新写法
2015/06/18 Python
快速入门python学习笔记
2017/12/06 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python lambda表达式用法实例分析
2018/12/25 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
教师旷工检讨书
2015/08/15 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书