最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python多進(jìn)程中的內(nèi)存復(fù)制(實(shí)例講解)

 更新時(shí)間:2018年01月05日 14:40:50   作者:pushiqiang  
下面小編就為大家分享一篇python多進(jìn)程中的內(nèi)存復(fù)制(實(shí)例講解),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

比較好奇python對于多進(jìn)程中copy on write機(jī)制的實(shí)際使用情況。目前從實(shí)驗(yàn)結(jié)果來看,python 使用multiprocessing來創(chuàng)建多進(jìn)程時(shí),無論數(shù)據(jù)是否不會(huì)被更改,子進(jìn)程都會(huì)復(fù)制父進(jìn)程的狀態(tài)(內(nèi)存空間數(shù)據(jù)等)。所以如果主進(jìn)程耗的資源較多時(shí),不小心就會(huì)造成不必要的大量的內(nèi)存復(fù)制,從而可能導(dǎo)致內(nèi)存爆滿的情況。

示例

舉個(gè)例子,假設(shè)主進(jìn)程讀取了一個(gè)大文件對象的所有行,然后通過multiprocessing創(chuàng)建工作進(jìn)程,并循環(huán)地將每一行數(shù)據(jù)交給工作進(jìn)程來處理:

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結(jié)果:

(四個(gè)子進(jìn)程)

(父進(jìn)程及四個(gè)子進(jìn)程)

由上兩張圖可以看出父進(jìn)程及子進(jìn)程都各自占用了1.4G左右的內(nèi)存空間。而大部分內(nèi)存空間存儲(chǔ)的是讀數(shù)據(jù)lines,所以這樣的內(nèi)存開銷太浪費(fèi)。

優(yōu)化計(jì)劃

1: 在主進(jìn)程初期未導(dǎo)入大量的py庫之前創(chuàng)建進(jìn)程,或者動(dòng)態(tài)加載py庫。

2:通過內(nèi)存共享來減少內(nèi)存的開銷。

3: 主進(jìn)程不再讀取文件對象,交給每個(gè)工作進(jìn)程去讀取文件中的相應(yīng)部分。

改進(jìn)代碼:

def line_count(file_name):
 count = -1 #讓空文件的行號(hào)顯示0
 for count,line in enumerate(open(file_name)): pass
 #enumerate格式化成了元組,count就是行號(hào),因?yàn)閺?開始要+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),)) #指定進(jìn)程讀某幾行數(shù)據(jù)
 pool.close()
 pool.join()

再次用top或者ps來查看進(jìn)程的內(nèi)存使用情況:

(四個(gè)子進(jìn)程)

(父進(jìn)程及四個(gè)子進(jìn)程)

小結(jié)

對比兩次的內(nèi)存使用情況,改進(jìn)代碼后父進(jìn)程及子進(jìn)程所占用的內(nèi)存明顯減少;所有內(nèi)存占用相當(dāng)于原來的一半,這就是減少內(nèi)存復(fù)制的效果。

關(guān)于內(nèi)存使用這方面還有不少優(yōu)化方法和空間,稍后繼續(xù)研究。

以上這篇python多進(jìn)程中的內(nèi)存復(fù)制(實(shí)例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python?matplotlib繪圖時(shí)指定圖像大小及放大圖像詳解

    Python?matplotlib繪圖時(shí)指定圖像大小及放大圖像詳解

    Matplotlib是一個(gè)面向?qū)ο蟮睦L圖庫,我們繪制的圖像中,每條曲線,每個(gè)邊框等等都對應(yīng)一個(gè)對象,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib繪圖時(shí)指定圖像大小及放大圖像的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Python pip安裝第三方庫的攻略分享

    Python pip安裝第三方庫的攻略分享

    pip 就是 Python 標(biāo)準(zhǔn)庫(The Python Standard Library)中的一個(gè)包,只是這個(gè)包比較特殊,用它可以來管理 Python 標(biāo)準(zhǔn)庫(The Python Standard Library)中其他的包。本文為大家介紹了pip安裝第三方庫的方法,需要的可以參考一下
    2022-11-11
  • Python列表常用函數(shù)使用詳解

    Python列表常用函數(shù)使用詳解

    這篇文章主要為大家介紹了Python列表常用的一些函數(shù)的使用詳解,并通過一些簡單的案例讓大家更快的理解,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • Python常用配置文件ini、json、yaml讀寫總結(jié)

    Python常用配置文件ini、json、yaml讀寫總結(jié)

    用的配置文件格式有ini、json、yaml等,下面簡單給大家介紹下,Python如何讀寫這幾種格式的文件,對Python讀寫ini、json、yaml配置文件相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-07-07
  • python亂序字符串排序的實(shí)現(xiàn)方式

    python亂序字符串排序的實(shí)現(xiàn)方式

    這篇文章主要介紹了python亂序字符串排序的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python中關(guān)于CIFAR10數(shù)據(jù)集的使用

    python中關(guān)于CIFAR10數(shù)據(jù)集的使用

    這篇文章主要介紹了python中關(guān)于CIFAR10數(shù)據(jù)集的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用Python中tkinter庫簡單gui界面制作及打包成exe的操作方法(二)

    使用Python中tkinter庫簡單gui界面制作及打包成exe的操作方法(二)

    這篇文章主要介紹了使用Python中tkinter庫簡單gui界面制作及打包成exe的操作方法(二),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 通過實(shí)例解析python創(chuàng)建進(jìn)程常用方法

    通過實(shí)例解析python創(chuàng)建進(jìn)程常用方法

    這篇文章主要介紹了通過實(shí)例解析python創(chuàng)建進(jìn)程常用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python使用thread模塊實(shí)現(xiàn)多線程的操作

    Python使用thread模塊實(shí)現(xiàn)多線程的操作

    線程(Threads)是操作系統(tǒng)提供的一種輕量級(jí)的執(zhí)行單元,可以在一個(gè)進(jìn)程內(nèi)并發(fā)執(zhí)行多個(gè)任務(wù),每個(gè)線程都有自己的執(zhí)行上下文,包括棧、寄存器和程序計(jì)數(shù)器,本文給大家介紹了Python使用thread模塊實(shí)現(xiàn)多線程的操作,需要的朋友可以參考下
    2024-10-10
  • python文件操作之目錄遍歷實(shí)例分析

    python文件操作之目錄遍歷實(shí)例分析

    這篇文章主要介紹了python文件操作之目錄遍歷的方法,以實(shí)例形式較為詳細(xì)的分析了目錄遍歷所需要用到的相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

常德市| 桑植县| 绿春县| 会昌县| 奇台县| 巴林左旗| 平武县| 大邑县| 嘉义市| 廊坊市| 财经| 浮山县| 南郑县| 河西区| 堆龙德庆县| 思茅市| 紫阳县| 仲巴县| 昆明市| 中方县| 丽水市| 沈阳市| 开远市| 宜黄县| 太谷县| 贡嘎县| 江安县| 沙湾县| 新沂市| 东乡族自治县| 同心县| 庐江县| 岚皋县| 漳平市| 玛纳斯县| 类乌齐县| 海城市| 十堰市| 荃湾区| 铅山县| 江安县|