python多程序中的記憶體複製 例項講解

2022-09-28 20:57:21 字數 1965 閱讀 9399

比較好奇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(processewww.cppcns.coms==4)

rel = pool.map(parse_lines , itertools.izip(lines , itertools.repeat(second_args)) , int(lewww.cppcns.comn(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.cl

#working

def main_logic(filename,process_num):

line_count = line_count(filename)

**g_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***g_len

pool.apply_async(parse_lines, ((filename, st_line, st_line+**g_len+ext_cnt),)) #指定程序讀某幾行資料

pool.close()

pool.join()

再次用top或者ps來檢視程序的記憶體使用情況:

(四個子程序)

(父程序及四個子程序)

小結對比兩次的記憶體使用情況,改進**後父程序及子程序所占用的記憶體明顯減少;所有記憶體占用相當於原來的一半,這就是減少記憶體複製的效果。

關於記憶體使用這方面還有程式設計客棧不少優化方法和空間,稍後繼續研究。

本文標題: python多程序中的記憶體複製(例項講解)

本文位址:

Python中的多程序

編寫完的 沒有執行時稱為程式,正在執行的 稱為程序。程式是死的 靜態的 程序是活的 動態的 作業系統輪流讓各個任務交替執行,由於cpu的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。多程序中,每個程序中所有資料 包括全域性變數 都各自擁有乙份,互不影響。例如 我們啟動了qq,qq就是乙...

python中的多程序

import multiprocessing import time deffunc arg pname multiprocessing.current process name pid multiprocessing.current process pid print 當前程序id d,name ...

python多程序 python多程序

當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...