这篇文章主要介绍了如何在python多进程中复制内存,天达云小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随天达云小编来看看吧!
python是什么意思
Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。
举个例子,假设主进程读取了一个大文件对象的所有行,然后通过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多进程中复制内存,如何觉得天达云网站的内容还不错,欢迎将天达云网站推荐给身边好友。