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读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python Matplotlib库入门指南
May 18 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
详解flask表单提交的两种方式
Jul 21 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Python集合操作方法详解
Feb 09 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
Apr 08 Python
pytorch 梯度NAN异常值的解决方案
Jun 05 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版
2006/10/09 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Three.js学习之网格
2016/08/10 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
javascript实现小型区块链功能
2019/04/03 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python中append实例用法总结
2019/07/30 Python
500行python代码实现飞机大战
2020/04/24 Python
Python常用外部指令执行代码实例
2020/11/05 Python
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
优秀班集体先进事迹材料
2014/05/28 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
离婚协议书格式
2015/01/26 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python