利用Python如何實(shí)時(shí)檢測(cè)自身內(nèi)存占用
前言
最近在做文本統(tǒng)計(jì),用 Python 實(shí)現(xiàn),遇到了一個(gè)比較有意思的難題——如何保存統(tǒng)計(jì)結(jié)果。
直接寫(xiě)入內(nèi)存實(shí)在是放不下,十幾個(gè)小時(shí)后內(nèi)存耗盡,程序被迫關(guān)閉。如果直接寫(xiě)入數(shù)據(jù)庫(kù)吧,每次寫(xiě)入又太慢了,本來(lái)就十幾個(gè)小時(shí)了,這樣下去就要往星期上數(shù)了,也不是個(gè)辦法。
解決方案
最后,我想到了一個(gè)兩者兼顧的方案——用內(nèi)存做緩沖,達(dá)到一定量之后一次性將當(dāng)前所有數(shù)據(jù)合并到硬盤里。
但這樣就有一個(gè)閾值,如何確定同步硬盤的時(shí)機(jī),通??梢园凑瘴募6冗M(jìn)行處理,比如處理一個(gè)語(yǔ)料文件同步一次……但我的語(yǔ)料有大有小,大的有10GB,根本等不到那一刻內(nèi)存就爆炸了,后來(lái)我想用統(tǒng)計(jì)數(shù)據(jù)量進(jìn)行判斷……可這又有點(diǎn)難以估計(jì),小了吧頻繁寫(xiě)入,緩存的意義就不大了,大了吧還沒(méi)等到條目數(shù)量達(dá)到,內(nèi)存就已經(jīng)爆滿。另外考慮到將來(lái)程序會(huì)運(yùn)行在不同配置的設(shè)備上,讓其他開(kāi)發(fā)者根據(jù)自身情況計(jì)算這個(gè)閾值也有點(diǎn)太不友好,于是我想到了一個(gè)辦法——不如讓 Python 自己檢測(cè)自己的內(nèi)存占用,如果快滿了(或者達(dá)到閾值),就同步寫(xiě)入硬盤一次。
對(duì)于其他開(kāi)發(fā)者來(lái)說(shuō),自身設(shè)備的內(nèi)存多大是很容易查看的,根據(jù)系統(tǒng)運(yùn)行狀況設(shè)置一個(gè)合理的閾值,相當(dāng)方便。
要用 Python 監(jiān)控自身內(nèi)存占用,要使用 psutil 這個(gè)庫(kù)來(lái)和系統(tǒng)進(jìn)行交互,基本邏輯就是先拿到自己的 pid ,然后根據(jù)這個(gè) pid 去跟系統(tǒng)獲取進(jìn)程信息。
def get_current_memory_gb() -> int: # 獲取當(dāng)前進(jìn)程內(nèi)存占用。 pid = os.getpid() p = psutil.Process(pid) info = p.memory_full_info() return info.uss / 1024. / 1024. / 1024.
比如我系統(tǒng)是 32GB 內(nèi)存,那么我設(shè)置個(gè) 20GB 就相當(dāng)安全,用 Python 進(jìn)行統(tǒng)計(jì)語(yǔ)料,數(shù)據(jù)多到進(jìn)程占用 20GB 內(nèi)存了,就把當(dāng)前的數(shù)據(jù)寫(xiě)入硬盤,同步統(tǒng)計(jì)數(shù)據(jù),然后清空程序里的字典緩存釋放內(nèi)存。
python之psutil
psutil是個(gè)跨平臺(tái)庫(kù),能夠輕松實(shí)現(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率,包括CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等信息。
Linux系統(tǒng)下的安裝
pip install psutil
總結(jié)
到此這篇關(guān)于利用Python如何實(shí)時(shí)檢測(cè)自身內(nèi)存占用的文章就介紹到這了,更多相關(guān)Python實(shí)時(shí)檢測(cè)自身內(nèi)存占用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python實(shí)現(xiàn)去重聚合Excel數(shù)據(jù)并對(duì)比兩份數(shù)據(jù)的差異
在數(shù)據(jù)處理過(guò)程中,常常需要將多個(gè)數(shù)據(jù)表進(jìn)行合并,并進(jìn)行比對(duì),以便找出數(shù)據(jù)的差異和共同之處,本文將介紹如何使用 Pandas 庫(kù)對(duì)兩個(gè) Excel 數(shù)據(jù)表進(jìn)行合并與比對(duì),需要的可以參考下2023-11-11
python 實(shí)現(xiàn)字符串下標(biāo)的輸出功能
這篇文章主要介紹了python 簡(jiǎn)單的實(shí)現(xiàn)字符串下標(biāo)的輸出,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
淺談keras中Dropout在預(yù)測(cè)過(guò)程中是否仍要起作用
這篇文章主要介紹了淺談keras中Dropout在預(yù)測(cè)過(guò)程中是否仍要起作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
pyspark 讀取csv文件創(chuàng)建DataFrame的兩種方法
今天小編就為大家分享一篇pyspark 讀取csv文件創(chuàng)建DataFrame的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python將txt文檔每行內(nèi)容循環(huán)插入數(shù)據(jù)庫(kù)的方法
今天小編就為大家分享一篇python將txt文檔每行內(nèi)容循環(huán)插入數(shù)據(jù)庫(kù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Django URL和View的關(guān)系說(shuō)明
這篇文章主要介紹了Django URL和View的關(guān)系說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Python Scrapy多頁(yè)數(shù)據(jù)爬取實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python Scrapy多頁(yè)數(shù)據(jù)爬取實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

