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 12 Python
Python实现微信公众平台自定义菜单实例
Mar 20 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
python3 字符串知识点学习笔记
Feb 08 Python
Python线程threading模块用法详解
Feb 26 Python
Python如何读写二进制数组数据
Aug 01 Python
python super()函数的基本使用
Sep 10 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
详解php反序列化
2020/06/10 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
Angular实现可删除并计算总金额的购物车功能示例
2017/12/26 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
Mac 上切换Python多版本
2017/06/17 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python看某个模块的版本方法
2018/10/16 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
应届本科生推荐信范文
2013/12/25 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
车辆年审委托书范本
2014/09/18 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏