python多進程中的記憶體複製(執行個體講解),python執行個體講解

來源:互聯網
上載者:User

python多進程中的記憶體複製(執行個體講解),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+1def parse_lines(args): f = open(args[0] , 'r') lines = f.readlines()[args[1]:args[2]] #read some lines f.close()  #workingdef 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多進程中的記憶體複製(執行個體講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援幫客之家。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.