比較好奇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...