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 相关文章推荐
MySQL适配器PyMySQL详解
Sep 20 Python
实用自动化运维Python脚本分享
Jun 04 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 Python
python中比较两个列表的实例方法
Jul 04 Python
django fernet fields字段加密实践详解
Aug 12 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 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 file_exists问题杂谈
2012/05/07 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
js的2种继承方式详解
2014/03/04 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
python批量修改xml属性的实现方式
2020/03/05 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
教师师德师风自我剖析材料
2014/09/29 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
用JS创建一个录屏功能
2021/11/11 Javascript