亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

比較好奇python對(duì)于多進(jìn)程中copy on write機(jī)制的實(shí)際使用情況。目前從實(shí)驗(yàn)結(jié)果來(lái)看,python 使用multiprocessing來(lái)創(chuàng)建多進(jìn)程時(shí),無(wú)論數(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è)大文件對(duì)象的所有行,然后通過multiprocessing創(chuàng)建工作進(jìn)程,并循環(huán)地將每一行數(shù)據(jù)交給工作進(jìn)程來(lái)處理:

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庫(kù)之前創(chuàng)建進(jìn)程,或者動(dòng)態(tài)加載py庫(kù)。

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

3: 主進(jìn)程不再讀取文件對(duì)象,交給每個(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來(lái)查看進(jìn)程的內(nèi)存使用情況:

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

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

小結(jié)

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

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

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

相關(guān)文章

  • python beautiful soup庫(kù)入門安裝教程

    python beautiful soup庫(kù)入門安裝教程

    Beautiful Soup是python的一個(gè)庫(kù),最主要的功能是從網(wǎng)頁(yè)抓取數(shù)據(jù)。今天通過本文給大家分享python beautiful soup庫(kù)入門教程,需要的朋友參考下吧
    2021-08-08
  • python實(shí)現(xiàn)將文件夾內(nèi)的每張圖片批量分割成多張

    python實(shí)現(xiàn)將文件夾內(nèi)的每張圖片批量分割成多張

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)將文件夾內(nèi)的每張圖片批量分割成多張,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 使用python實(shí)現(xiàn)省市三級(jí)菜單效果

    使用python實(shí)現(xiàn)省市三級(jí)菜單效果

    本文給大家分享的是使用使用python實(shí)現(xiàn)省市三級(jí)菜單效果的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。
    2016-01-01
  • Python從入門到精通之多線程使用詳解

    Python從入門到精通之多線程使用詳解

    這篇文章主要介紹了Python中的多線程使用,包括創(chuàng)建線程、線程同步、線程間通信以及線程池等基本概念和技巧,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-07-07
  • 14 個(gè)Python小游戲 源碼分享

    14 個(gè)Python小游戲 源碼分享

    今天給大家?guī)?lái)14個(gè)py小游戲如:吃金幣、打乒乓、滑雪、并夕夕版飛機(jī)大戰(zhàn)、打地鼠、小恐龍、消消樂、俄羅斯方塊、貪吃蛇、24點(diǎn)小游戲、平衡木、外星人入侵、貪心鳥、井字棋888‘’,文章都帶了源碼,感興趣的小伙伴感快收藏起來(lái)吧
    2021-09-09
  • Python牛刀小試密碼爆破

    Python牛刀小試密碼爆破

    用Python與vbs分別實(shí)現(xiàn)的爆破bbs論壇賬號(hào)的代碼,學(xué)習(xí)python或vbs的朋友可以參考下。
    2011-02-02
  • 詳解python中__name__的意義以及作用

    詳解python中__name__的意義以及作用

    這篇文章主要介紹了詳解python中__name__的意義以及作用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 如何在scrapy中集成selenium爬取網(wǎng)頁(yè)的方法

    如何在scrapy中集成selenium爬取網(wǎng)頁(yè)的方法

    這篇文章主要介紹了如何在scrapy中集成selenium爬取網(wǎng)頁(yè)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 零基礎(chǔ)寫python爬蟲之抓取百度貼吧代碼分享

    零基礎(chǔ)寫python爬蟲之抓取百度貼吧代碼分享

    前面幾篇都是以介紹基礎(chǔ)知識(shí)為主,各位童鞋估計(jì)都在犯嘀咕了,你到底寫不寫爬蟲?。??額,好吧,本文就給大家寫一個(gè)簡(jiǎn)單的百度貼吧的python爬蟲代碼。
    2014-11-11
  • Python進(jìn)行數(shù)據(jù)可視化Plotly與Dash的應(yīng)用小結(jié)

    Python進(jìn)行數(shù)據(jù)可視化Plotly與Dash的應(yīng)用小結(jié)

    數(shù)據(jù)可視化是數(shù)據(jù)分析中至關(guān)重要的一環(huán),它能夠幫助我們更直觀地理解數(shù)據(jù)并發(fā)現(xiàn)隱藏的模式和趨勢(shì),本文主要介紹了Python進(jìn)行數(shù)據(jù)可視化Plotly與Dash的應(yīng)用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04

最新評(píng)論