欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python進(jìn)程使用內(nèi)存后不釋放的解決

 更新時(shí)間:2023年11月07日 11:01:32   作者:Rnan-prince  
這篇文章主要介紹了Python進(jìn)程使用內(nèi)存后不釋放的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

使用python進(jìn)行大量的數(shù)據(jù)操作過(guò)程中RSS占用(幾個(gè)G,Python的GC會(huì)頻繁地malloc/free),發(fā)現(xiàn)RSS內(nèi)存不釋放。

  • 排查代碼后,沒(méi)有發(fā)現(xiàn)內(nèi)存泄露的情況,GC也是默認(rèn)開(kāi)啟的,甚至代碼將數(shù)據(jù)庫(kù)數(shù)據(jù)讀出來(lái)遍歷一遍后程序結(jié)束,內(nèi)存一直存在不釋放。
  • 使用tracemalloc,objectgraph調(diào)試,Python對(duì)象的產(chǎn)生和釋放并沒(méi)有啥異常。
  • Python的對(duì)象內(nèi)存管理是基于引用計(jì)數(shù)的(refcnt為0直接decref回收),python內(nèi)存池也沒(méi)發(fā)現(xiàn)大內(nèi)存駐留,操作系統(tǒng)brk和mmap也并沒(méi)有不釋放內(nèi)存。

在調(diào)測(cè)中也發(fā)現(xiàn),這個(gè)問(wèn)題給人的整體感覺(jué)不是代碼哪里有問(wèn)題,查閱相關(guān)資料后,發(fā)現(xiàn)可能是Glibc優(yōu)化問(wèn)題。

python的內(nèi)存機(jī)制,頻繁通過(guò)系統(tǒng)調(diào)用獲取和釋放內(nèi)存對(duì)性能消耗很大的,python將對(duì)象銷(xiāo)毀后,并沒(méi)有立即將這部分內(nèi)存返回給操作系統(tǒng),而是加到了自己維護(hù)的空閑內(nèi)存池中。

從系統(tǒng)層面來(lái)看,這步扥內(nèi)存已經(jīng)被python進(jìn)程占用了,但是從python解釋器的角度來(lái)看,這部分是free的,可以用于生成新的對(duì)象。

那么我們?cè)赑ython中如何手動(dòng)分配釋放內(nèi)存?

我們使用進(jìn)程內(nèi)存隔離的能力直接管理內(nèi)存,父進(jìn)程只負(fù)責(zé)進(jìn)程池管理,子進(jìn)程干完事情,直接退出,或過(guò)期重新拉起,或者超過(guò)內(nèi)存閾值就干掉,就可以了(當(dāng)然最好是業(yè)務(wù)處理不是很頻繁的情況下)。

多進(jìn)程處理參考:multiprocessing --- 基于進(jìn)程的并行 — Python 3.10.0 文檔

Process 類(lèi)

在 multiprocessing 中,通過(guò)創(chuàng)建一個(gè) Process 對(duì)象然后調(diào)用它的 start() 方法來(lái)生成進(jìn)程。 

Process 和 threading.Thread API 相同。

一個(gè)簡(jiǎn)單的多進(jìn)程程序示例是:

from multiprocessing import Process
 
def f(name):
    print('hello', name)
 
if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

常見(jiàn)問(wèn)題 

實(shí)際業(yè)務(wù)中會(huì)經(jīng)常用到數(shù)據(jù)庫(kù)等長(zhǎng)連接的操作,如數(shù)據(jù)庫(kù)等,

可能會(huì)報(bào)如下錯(cuò)誤:

ERROR:base.py:Line 705:_finalize_fairy:Exception during reset or similar
 
Traceback (most recent call last):
  File "/home/tsalazar/.cache/pypoetry/virtualenvs/ufos--PZ7y9g--py3.8/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 697, in _finalize_fairy
    fairy._reset(pool)
 
  File "/home/tsalazar/.cache/pypoetry/virtualenvs/ufos--PZ7y9g--py3.8/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 893, in _reset
    pool._dialect.do_rollback(self)
 
  File "/home/tsalazar/.cache/pypoetry/virtualenvs/ufos--PZ7y9g--py3.8/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 558, in do_rollback
    dbapi_connection.rollback()
 
psycopg2.OperationalError: SSL error: decryption failed or bad record mac

解決辦法

不要將長(zhǎng)連接對(duì)象通過(guò)參數(shù)傳遞,在函數(shù)內(nèi)部鏈接,使得進(jìn)程之間互不影響。 

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python計(jì)算鄰接矩陣的實(shí)現(xiàn)示例

    python計(jì)算鄰接矩陣的實(shí)現(xiàn)示例

    鄰接矩陣是一種常見(jiàn)的圖表示方法,本文主要介紹了python計(jì)算鄰接矩陣的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 詳解Python3的TFTP文件傳輸

    詳解Python3的TFTP文件傳輸

    本篇內(nèi)容給大家詳細(xì)講述了Python3的TFTP文件傳輸?shù)南嚓P(guān)知識(shí)點(diǎn),有需要的朋友可以參考下。
    2018-06-06
  • Python3加密解密庫(kù)Crypto的RSA加解密和簽名/驗(yàn)簽實(shí)現(xiàn)方法實(shí)例

    Python3加密解密庫(kù)Crypto的RSA加解密和簽名/驗(yàn)簽實(shí)現(xiàn)方法實(shí)例

    這篇文章主要介紹了Python3加密解密庫(kù)Crypto的RSA加解密和簽名/驗(yàn)簽實(shí)現(xiàn)方法實(shí)例,需要的朋友可以參考下
    2020-02-02
  • 使用Python制作一個(gè)批量查詢搜索排名工具

    使用Python制作一個(gè)批量查詢搜索排名工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python制作一個(gè)批量查詢搜索排名工具,并且不需要花費(fèi)任何費(fèi)用,裝上python開(kāi)發(fā)環(huán)境即可,需要的可以參考一下
    2023-06-06
  • Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類(lèi)預(yù)測(cè)篇解讀

    Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類(lèi)預(yù)測(cè)篇解讀

    這篇文章我們繼續(xù)學(xué)習(xí)一下GBDT模型的另一個(gè)進(jìn)化版本:LightGBM,LigthGBM是boosting集合模型中的新進(jìn)成員,由微軟提供,它和XGBoost一樣是對(duì)GBDT的高效實(shí)現(xiàn),原理上它和GBDT及XGBoost類(lèi)似,都采用損失函數(shù)的負(fù)梯度作為當(dāng)前決策樹(shù)的殘差近似值,去擬合新的決策樹(shù)
    2022-01-01
  • Python實(shí)現(xiàn)截圖生成符合markdown的鏈接

    Python實(shí)現(xiàn)截圖生成符合markdown的鏈接

    之前是用的是typora來(lái)寫(xiě)的文章,最近typora最近開(kāi)始收費(fèi)了,所以就不想用了,于是找到了一個(gè)替代品MarkText。本文將介紹如何通過(guò)Python實(shí)現(xiàn)截圖自動(dòng)生成符合markdown的鏈接,感興趣的可以了解一下
    2022-01-01
  • python將人民幣轉(zhuǎn)換大寫(xiě)的腳本代碼

    python將人民幣轉(zhuǎn)換大寫(xiě)的腳本代碼

    python將人民幣轉(zhuǎn)換大寫(xiě)的代碼,有需要的朋友可以參考下
    2013-02-02
  • Python連接Mysql進(jìn)行增刪改查的示例代碼

    Python連接Mysql進(jìn)行增刪改查的示例代碼

    這篇文章主要介紹了Python連接Mysql進(jìn)行增刪改查的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python批量模糊匹配的3種方法實(shí)例

    Python批量模糊匹配的3種方法實(shí)例

    模糊匹配可以算是現(xiàn)代編輯器的一個(gè)必備特性了,它所做的就是根據(jù)用戶輸入的部分內(nèi)容,猜測(cè)用戶想要的文件名,并提供一個(gè)推薦列表供用戶選擇,下面這篇文章主要給大家介紹了關(guān)于Python批量模糊匹配的3種方法,需要的朋友可以參考下
    2022-03-03
  • Python實(shí)現(xiàn)連通域標(biāo)記算法

    Python實(shí)現(xiàn)連通域標(biāo)記算法

    如果把圖像分為前景和背景兩部分,那么連通域就是連通在一起的前景,這種關(guān)系對(duì)于二值圖像來(lái)說(shuō)比較明顯,下面我們就來(lái)了解一下連通域標(biāo)記算法原理及其Python實(shí)現(xiàn)吧
    2023-12-12

最新評(píng)論