Python 多進(jìn)程內(nèi)存占用問題

問題描述

當(dāng)我們有一個(gè)很長(zhǎng)很長(zhǎng)的任務(wù)隊(duì)列(mission_list)和閾值對(duì)應(yīng)的一個(gè)處理函數(shù)(missionFunction)時(shí),我們一般采用如下的方式進(jìn)行處理:

mission_list=[1,2,3,4,5]
def missionFunction(x):
    return x**2
#一般情況下的處理方法
for x in mission_list:
    XXX=missionFunction(x)

但是亩冬,如果這任務(wù)列表很長(zhǎng)很長(zhǎng)词顾,處理函數(shù)很復(fù)雜(占用cpu)時(shí)映琳,單核往往需要很長(zhǎng)的時(shí)間進(jìn)行處理牙咏,此時(shí)早直,Multiprocess便可以極大的提高我們程序的運(yùn)行速度祷肯,相關(guān)內(nèi)容請(qǐng)借鑒multiprocessing --- 基于進(jìn)程的并行 — Python 3.10.4 文檔唯卖。

以上這種場(chǎng)景下粱玲,推薦大家采用最簡(jiǎn)單的進(jìn)程池+map的方法進(jìn)行處理,標(biāo)準(zhǔn)的寫法拜轨,chunksize要借鑒官方的說法抽减,最好大一點(diǎn)

from multiprocessing import Pool
mission_list=[1,2,3,4,5]
def missionFunction(x):
    return x**2
#一般情況下的多進(jìn)程寫法
with Pool(processes=n) as pool:
    pool.map(missionFunction, mission_list,chunksize=1000)

...

內(nèi)存優(yōu)化

但是!i夏搿B殉痢!如果我們的任務(wù)列表非常的長(zhǎng)法牲,這會(huì)導(dǎo)致多進(jìn)程還沒跑起來之前史汗,內(nèi)存已經(jīng)撐爆了,任務(wù)自然沒法完成拒垃,此時(shí)我們有幾種辦法進(jìn)行優(yōu)化:

1. 進(jìn)程的啟動(dòng)方式

進(jìn)程的啟動(dòng)方法有三種停撞,可參考官方文檔:

[圖片上傳失敗...(image-48cd3c-1650511153989)]

在linux環(huán)境下,使用forkserver可以節(jié)省很多的內(nèi)存空間悼瓮,因?yàn)檫M(jìn)程啟動(dòng)的是一個(gè)服務(wù)戈毒,不會(huì)把主進(jìn)程的數(shù)據(jù)全部復(fù)制

2. 采用imap

采用imap會(huì)極大的節(jié)省空間,它返回的是一個(gè)迭代器横堡,也就是結(jié)果列表:

with Pool() as pool:
    ans= pool.imap(missionFunction, mission_list)
    for ret in ans:
        # do something

但注意埋市,以上寫法中,你寫的結(jié)果迭代部分必須寫在with下面命贴〉勒或者采用另一種寫法:

pool = Pool()
ans= pool.imap(missionFunction, mission_list)
...

for ret in ans:
  # do something
pool.close()

3. mission_list的優(yōu)化

還有最后一種,當(dāng)你的missionlist實(shí)在太大了胸蛛,導(dǎo)致你在生成missionlist的時(shí)候已經(jīng)把內(nèi)存撐爆了污茵,這個(gè)時(shí)候就得優(yōu)化mission_list了,如果你的mission_list是通過一個(gè)for循環(huán)生成的葬项,你可以使用yield字段泞当,將其封裝為一個(gè)迭代器,傳入進(jìn)程池:

## 你的原始寫法可能是這樣的
def generate_mission_list(**args):
    mission_list=[]
    #這里有很多相關(guān)的代碼玷室,用于生成mission_list
    for ... in ...:
        ...
        mission_list.append(mission)
    return mission_list
## 執(zhí)行
mission_list=generate_mission_list(...)
for mission in mission_list:
    .....


## 建議的寫法
def generate_mission_list(**args):
    #這里有很多相關(guān)的代碼零蓉,用于生成mission_list
    for ... in ...:
        ...
        yield mission

mission_list=generate_mission_list(...)
for mission in mission_list:
    .....

這樣子笤受,我們就封裝好了mission_list穷缤,它是一個(gè)可迭代對(duì)象,在取數(shù)據(jù)的時(shí)候才會(huì)將數(shù)據(jù)拉到內(nèi)存

我在項(xiàng)目中結(jié)合了后兩種方法箩兽,原本256G的內(nèi)存都不夠用津肛,但在修改后內(nèi)存只占用了不到10G。希望能夠幫助到你

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汗贫,一起剝皮案震驚了整個(gè)濱河市身坐,隨后出現(xiàn)的幾起案子秸脱,更是在濱河造成了極大的恐慌,老刑警劉巖部蛇,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊唇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涯鲁,警方通過查閱死者的電腦和手機(jī)巷查,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抹腿,“玉大人岛请,你說我怎么就攤上這事【ǎ” “怎么了崇败?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肩祥。 經(jīng)常有香客問我后室,道長(zhǎng),這世上最難降的妖魔是什么搭幻? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任咧擂,我火速辦了婚禮,結(jié)果婚禮上檀蹋,老公的妹妹穿的比我還像新娘松申。我一直安慰自己,他們只是感情好俯逾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布贸桶。 她就那樣靜靜地躺著,像睡著了一般桌肴。 火紅的嫁衣襯著肌膚如雪皇筛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天坠七,我揣著相機(jī)與錄音水醋,去河邊找鬼。 笑死彪置,一個(gè)胖子當(dāng)著我的面吹牛拄踪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拳魁,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惶桐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姚糊,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤贿衍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后救恨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贸辈,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年肠槽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裙椭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡署浩,死狀恐怖揉燃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筋栋,我是刑警寧澤炊汤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弊攘,受9級(jí)特大地震影響抢腐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟交,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一迈倍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捣域,春花似錦啼染、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贞言,卻和暖如春斜棚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背该窗。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工弟蚀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酗失。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓义钉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親级零。 傳聞我的和親對(duì)象是個(gè)殘疾皇子断医,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容