python多进程中的内存复制(实例讲解)
作者:pushiqiang 时间:2022-01-20 23:34:46
比较好奇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结果:
(四个子进程)
(父进程及四个子进程)
由上两张图可以看出父进程及子进程都各自占用了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来查看进程的内存使用情况:
(四个子进程)
(父进程及四个子进程)
小结
对比两次的内存使用情况,改进代码后父进程及子进程所占用的内存明显减少;所有内存占用相当于原来的一半,这就是减少内存复制的效果。
关于内存使用这方面还有不少优化方法和空间,稍后继续研究。
来源:http://blog.csdn.net/pushiqiang/article/details/78952101
标签:python,多进程,内存,复制
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Oracle临时表空间删除和重建实现过程
2023-07-18 09:26:04
Python人工智能实战之对话机器人的实现
2021-03-20 15:59:18
![](https://img.aspxhome.com/file/2023/7/75977_0s.jpg)
python下如何查询CS反恐精英的服务器信息
2021-09-15 05:51:47
Pytorch中的variable, tensor与numpy相互转化的方法
2021-08-16 13:59:50
![](https://img.aspxhome.com/file/2023/5/101625_0s.png)
opencv基于Haar人脸检测和眼睛检测
2022-02-10 13:43:59
![](https://img.aspxhome.com/file/2023/1/90891_0s.jpg)
python三大器之迭代器、生成器、装饰器
2022-04-14 13:44:20
![](https://img.aspxhome.com/file/2023/3/102923_0s.jpg)
Django添加KindEditor富文本编辑器的使用
2022-01-06 07:41:17
Python PCA降维的两种实现方法
2022-03-05 04:25:47
![](https://img.aspxhome.com/file/2023/7/99117_0s.png)
Mootools 1.2教程(22)——同时进行多个形变动画
2008-12-29 14:11:00
用一个例子来认识innerText,innerHTML
2007-12-24 17:17:00
asp中字符编码转换的10个函数[荐]
2007-11-11 10:32:00
asp如何制作一个股票滚屏显示面板?
2010-07-07 12:27:00
Python标准库使用OrderedDict类的实例讲解
2022-07-17 22:27:31
python 中的int()函数怎么用
2021-05-21 17:52:41
ASP开发中可能遇到的错误信息中文说明大全(整理收集)第1/2页
2010-07-02 09:50:31
MySQL常见错误提示及解决方法
2008-02-23 10:08:00
Python抽象基类的定义与使用方法
2021-07-31 21:48:43
![](https://img.aspxhome.com/file/2023/5/84145_0s.png)
Python数据结构之队列详解
2023-11-17 14:04:34
![](https://img.aspxhome.com/file/2023/5/76795_0s.png)
解决python中set与dict的无序问题
2021-02-24 14:50:31
![](https://img.aspxhome.com/file/2023/7/105287_0s.jpg)
教你用Python脚本快速为iOS10生成图标和截屏
2022-03-04 05:08:28
![](https://img.aspxhome.com/file/2023/1/86211_0s.png)