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

 更新时间:2018年01月05日 14:40:50   作者:pushiqiang  
下面小编就为大家分享一篇python多进程中的内存复制(实例讲解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

比较好奇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来查看进程的内存使用情况:

(四个子进程)

(父进程及四个子进程)

小结

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

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

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

相关文章

  • 用Python按时间分割txt文件中的数据方法步骤

    用Python按时间分割txt文件中的数据方法步骤

    这篇文章主要给大家介绍了如何用Python按时间分割txt文件中的数据的方法步骤,文中通过代码示例给大家讲解的非常详细,对大家学习Python处理txt文件有一定的帮助,需要的朋友可以参考下
    2023-12-12
  • 使用pandas读取表格数据并进行单行数据拼接的详细教程

    使用pandas读取表格数据并进行单行数据拼接的详细教程

    这篇文章主要介绍了使用pandas读取表格数据并进行单行数据拼接的详细教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Pyramid将models.py文件的内容分布到多个文件的方法

    Pyramid将models.py文件的内容分布到多个文件的方法

    默认的Pyramid代码结构中,就只有一个models.py文件,在实际项目中,如果需要对models进行分类,放到不同文件下,应该怎么办
    2013-11-11
  • TensorFlow利用saver保存和提取参数的实例

    TensorFlow利用saver保存和提取参数的实例

    今天小编就为大家分享一篇TensorFlow利用saver保存和提取参数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python3安装speech语音模块的方法

    python3安装speech语音模块的方法

    今天小编就为大家分享一篇python3安装speech语音模块的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python字符串替换实例分析

    Python字符串替换实例分析

    这篇文章主要介绍了Python字符串替换的方法,实例对比分析了单个字符替换与字符串替换的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • Python中处理Session和Cookie的方法

    Python中处理Session和Cookie的方法

    这篇文章主要介绍了Python中处理Session和Cookie的方法,本文介绍了Python中如何处理Session和Cookie,包括获取、设置、删除和使用Session和Cookie的相关方法和技巧,主要涉及Python的requests、http.cookiejar和Flask等库和框架
    2023-05-05
  • Python 时间操作time详情

    Python 时间操作time详情

    这篇文章主要介绍了 Python 时间操作time详情,在Python高级语言中,内置库提供了time和datetime模块进行对时间日期的处理。本文,我们将进行对Time模块相关的方法进行学习,需要的朋友可以参考一下
    2021-11-11
  • python 操作excel表格的方法

    python 操作excel表格的方法

    这篇文章主要介绍了python 操作excel表格的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • 如何利用python实现列表嵌套字典取值

    如何利用python实现列表嵌套字典取值

    这篇文章主要介绍了如何利用python实现列表嵌套字典取值,首先通过将列表backup_unit_id全部提取出来,确定需要取值的对象展开文章内容,感兴趣的朋友可以看一下
    2022-06-06

最新评论