python內(nèi)存監(jiān)控工具memory_profiler和guppy的用法詳解
python2.7在內(nèi)存管理上相比python3還是有些坑的,其釋放后的內(nèi)存仍然保留在python的內(nèi)存池中,不被系統(tǒng)所用。python循環(huán)引用的變量不會(huì)被回收,這會(huì)導(dǎo)致程序越運(yùn)行,占用的內(nèi)存越大。我在跑py-faster-rcnn的demo時(shí),基本上跑2000張圖像,16g內(nèi)存就要爆了。于是嘗試用python的內(nèi)存監(jiān)控工具來(lái)調(diào)試程序,找到不能膨脹的變量,然后del之,再手動(dòng)回收內(nèi)存gc.collec()
下面是我用的兩個(gè)內(nèi)存監(jiān)視工具,一個(gè)是按每行代碼查看內(nèi)存占用的工具memory_profiler,一個(gè)是查看占用內(nèi)存前十位變量的工具guppy。
1. memory_profiler
首先是安裝:
pip install -U memory_profiler
然后用profile修飾想要查看的函數(shù)名:如:
@profile def my_func(): a = [1] * (10 ** 6) b = [2] * (2 * 10 ** 7) del b return a if __name__ == '__main__': my_func()
輸出結(jié)果:
Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a
memory_profiler功能強(qiáng)大,更多功能可以看官網(wǎng)這里
2. guppy
首先安裝:
pip install guppy
然后import下
from guppy import hpy hxx = hpy() heap = hxx.heap() byrcs = hxx.heap().byrcs;
在主程序下增加:
print(heap)
輸出示例:
Index Count % Size % Cumulative % Kind (class / dict of class) 0 10124 22 81944416 95 81944416 95 list 1 16056 34 1325464 2 83269880 96 str 2 9147 20 745616 1 84015496 97 tuple 3 102 0 366480 0 84381976 98 dict of module 4 287 1 313448 0 84695424 98 dict of type 5 2426 5 310528 0 85005952 98 types.CodeType 6 2364 5 283680 0 85289632 99 function 7 287 1 256960 0 85546592 99 type 8 169 0 192088 0 85738680 99 dict (no owner) 9 123 0 142728 0 85881408 99 dict of class
可以看到第一個(gè)list占了95%的內(nèi)存,若print(heap)在主程序的循環(huán)中,可以查看每次循環(huán)后的變量?jī)?nèi)存占用情況。
輸入以下命令,查看這個(gè)占內(nèi)存最大的list中的數(shù)據(jù)類型:
byrcs[0].byid
最后測(cè)試后發(fā)現(xiàn),test.py下get_im_blob等函數(shù)占用內(nèi)存不斷增大,每檢測(cè)一副圖像,該函數(shù)增加6-10MB內(nèi)存開銷。但奇怪的是用guppy查看前十個(gè)變量,并沒有發(fā)現(xiàn)哪個(gè)變量有明顯的內(nèi)存增大跡象。于是猜測(cè)可能是每張圖像推理后,推理的結(jié)果bbox,label,img等數(shù)據(jù)保存在了內(nèi)存中,這樣方便所有圖像推理結(jié)束后,plt.show().于是修改程序,每張圖像推理后,plt.show()一下。用memory_profiler發(fā)現(xiàn)內(nèi)存不再繼續(xù)增大,interesting!其實(shí)把plt.show()改成plt.close()也可以防止內(nèi)存不斷增大。具體原因肯定是python 的內(nèi)存回收機(jī)制規(guī)則導(dǎo)致的。
總結(jié)
以上所述是小編給大家介紹的python內(nèi)存監(jiān)控工具memory_profiler和guppy的用法詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
python實(shí)現(xiàn)協(xié)同過濾推薦算法完整代碼示例
這篇文章主要介紹了python實(shí)現(xiàn)協(xié)同過濾推薦算法完整代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
Python上下文管理器類和上下文管理器裝飾器contextmanager用法實(shí)例分析
這篇文章主要介紹了Python上下文管理器類和上下文管理器裝飾器contextmanager用法,結(jié)合實(shí)例形式分析了上下文管理器類定義、使用、sqlalchemy實(shí)現(xiàn)數(shù)據(jù)庫(kù)的自動(dòng)提交和回滾相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
Python編程快速上手——瘋狂填詞程序?qū)崿F(xiàn)方法分析
這篇文章主要介紹了Python瘋狂填詞程序?qū)崿F(xiàn)方法,結(jié)合具體案例形式分析了Python填詞算法相關(guān)的文件讀寫、正則匹配、數(shù)據(jù)遍歷等操作技巧,需要的朋友可以參考下2020-02-02
python實(shí)現(xiàn)轉(zhuǎn)盤效果 python實(shí)現(xiàn)輪盤抽獎(jiǎng)游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)轉(zhuǎn)盤效果,python實(shí)現(xiàn)輪盤抽獎(jiǎng)游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
如何解決安裝包過程中的Requirement already satisfied:問題
這篇文章主要介紹了如何解決安裝包過程中的Requirement already satisfied:問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Python實(shí)現(xiàn)操作Redis所有類型的方法詳解
Redis作為一款高性能的NoSQL數(shù)據(jù)庫(kù),越來(lái)越受到了廣大開發(fā)者的喜愛。本篇博客將介紹如何使用Python操作Redis的所有類型,以及一些高級(jí)用法,感興趣的可以了解一下2023-04-04
Python 使用PIL numpy 實(shí)現(xiàn)拼接圖片的示例
今天小編就為大家分享一篇Python 使用PIL numpy 實(shí)現(xiàn)拼接圖片的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-05-05
pyqt4教程之實(shí)現(xiàn)半透明的天氣預(yù)報(bào)界面示例
這篇文章主要介紹了pyqt4實(shí)現(xiàn)半透明的天氣預(yù)報(bào)界面示例,需要的朋友可以參考下2014-03-03

