最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

談談如何手動釋放Python的內存

 更新時間:2016年12月17日 17:22:21   作者:執(zhí)假以為真  
Python不會自動清理這些內存,這篇文章主要介紹了談談如何手動釋放Python的內存,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

在上篇博客中,提到了對一個腳本進行的多次優(yōu)化。當時以為已經(jīng)優(yōu)化得差不多了,但是當測試人員測試時,我才發(fā)現(xiàn),踩到了Python的一個大坑。

在上文的優(yōu)化中,對每500個用戶,會進行一些計算并記錄結果在磁盤文件中。原本以為這么做,這些結果就在磁盤文件中了,而不會再繼續(xù)占用內存;但實際上,Python的大坑就是Python不會自動清理這些內存。這是由其本身實現(xiàn)決定的。具體原因網(wǎng)上多有文章介紹,這里就不copy了。

本篇博客將貼一個筆者的實驗腳本,用以說明Python確實存在這么一個不釋放內存的現(xiàn)象,另外也提出一個解決方案,即:先del,再顯式調用gc.collect(). 腳本和具體效果見下。

實驗環(huán)境一:Win 7, Python 2.7

from time import sleep, time 
import gc 
 
def mem(way=1): 
 print time() 
 for i in range(10000000): 
  if way == 1: 
   pass 
  else: # way 2, 3 
   del i 
    
 print time() 
 if way == 1 or way == 2: 
  pass 
 else: # way 3 
  gc.collect() 
 print time() 
   
if __name__ == "__main__": 
 print "Test way 1: just pass" 
 mem(way=1) 
 sleep(20) 
 print "Test way 2: just del" 
 mem(way=2) 
 sleep(20) 
 print "Test way 3: del, and then gc.collect()" 
 mem(way=3) 
 sleep(20) 
  

運行結果如下:

Test way 1: just pass 
1426688589.47 
1426688590.25 
1426688590.25 
Test way 2: just del 
1426688610.25 
1426688611.05 
1426688611.05 
Test way 3: del, and then gc.collect() 
1426688631.05 
1426688631.85 
1426688631.95 

對于way 1和way 2,結果是完全一樣的,程序內存消耗峰值是326772KB,在sleep 20秒時,內存實時消耗是244820KB;

對于way 3,程序內存消耗峰值同上,但是sleep時內存實時消耗就只有6336KB了。

實驗環(huán)境二: Ubuntu 14.10, Python 2.7.3

運行結果:

Test way 1: just pass 
1426689577.46 
1426689579.41 
1426689579.41 
Test way 2: just del 
1426689599.43 
1426689601.1 
1426689601.1 
Test way 3: del, and then gc.collect() 
1426689621.12 
1426689622.8 
1426689623.11 
ubuntu@my_machine:~$ ps -aux | grep test_mem 
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html 
ubuntu 9122 10.0 6.0 270916 245564 pts/1 S+ 14:39 0:03 python test_mem.py 
ubuntu 9134 0.0 0.0 8104 924 pts/2 S+ 14:40 0:00 grep --color=auto test_mem 
ubuntu@my_machine:~$ ps -aux | grep test_mem 
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html 
ubuntu 9122 10.0 6.0 270916 245564 pts/1 S+ 14:39 0:03 python test_mem.py 
ubuntu 9134 0.0 0.0 8104 924 pts/2 S+ 14:40 0:00 grep --color=auto test_mem 
ubuntu@my_machine:~$ ps -aux | grep test_mem 
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html 
ubuntu 9122 11.6 0.1 30956 5608 pts/1 S+ 14:39 0:05 python test_mem.py 

結論:

以上說明,當調用del時,其實Python并不會真正release內存,而是將其繼續(xù)放在其內存池中;只有在顯式調用gc.collect()時,才會真正release內存。

進一步:

其實回到上一篇博客的腳本中,也讓其引入gc.collect(),然后寫個監(jiān)控腳本監(jiān)測內存消耗情況:

while ((1)); do ps -aux | sort -n -k5,6 | grep my_script; free; sleep 5; done 

結果發(fā)現(xiàn):內存并不會在每500個用戶一組執(zhí)行完后恢復,而是一直持續(xù)消耗到僅存約70MB時,gc才好像起作用。本環(huán)境中,機器使用的是Cloud instance,總內存2G,可用內存約為1G,本腳本內存常用消耗是900M - 1G。換句話說,對于這個腳本來說,gc并沒有立即起作用,而是在系統(tǒng)可用內存從1 - 1.2G下降到只剩70M左右時,gc才開始發(fā)揮作用。這點確實比較奇怪,不知道和該腳本是在Thread中使用的gc.collect()是否有關,或者是gc發(fā)揮作用原本就不是可控的。筆者尚未做相關實驗,可能在下篇博客中繼續(xù)探討。

但是,可以肯定的是,若不使用gc.collect(), 原腳本將會將系統(tǒng)內存耗盡而被殺死。這一點從syslog中可以明顯看出。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python使用itcaht庫實現(xiàn)微信自動收發(fā)消息功能

    Python使用itcaht庫實現(xiàn)微信自動收發(fā)消息功能

    這篇文章主要介紹了Python使用itcaht庫實現(xiàn)微信自動收發(fā)消息功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Python常用Web框架Django、Flask與Tornado介紹

    Python常用Web框架Django、Flask與Tornado介紹

    這篇文章介紹了Python常用Web框架Django、Flask與Tornado,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 使用Python代碼進行PowerPoint演示文稿的合并與拆分

    使用Python代碼進行PowerPoint演示文稿的合并與拆分

    多個PowerPoint演示文稿的處理可能會成為非常麻煩的工作,有時需要將多個演示文稿合并為一個演示文稿,從而不用在演示時重復打開演示文稿,本文我們可以使用Python代碼來快速、準確的執(zhí)行PowerPoint演示文稿的合并于拆分操作,需要的朋友可以參考下
    2024-03-03
  • 使用python serial 獲取所有的串口名稱的實例

    使用python serial 獲取所有的串口名稱的實例

    今天小編就為大家分享一篇使用python serial 獲取所有的串口名稱的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 夯實基礎Python列表的索引和切片使用示例

    夯實基礎Python列表的索引和切片使用示例

    這篇文章主要為大家介紹了Python列表的索引和切片使用示例基礎詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • python實現(xiàn)數(shù)據(jù)挖掘中分箱的示例代碼

    python實現(xiàn)數(shù)據(jù)挖掘中分箱的示例代碼

    數(shù)據(jù)分箱(英語:Data?binning)是一種數(shù)據(jù)預處理方法,用于最大限度地減少小觀測誤差的影響,本文主要為大家介紹了python實現(xiàn)數(shù)據(jù)分箱的相關知識,感興趣的可以了解下
    2024-01-01
  • django 取消csrf限制的實例

    django 取消csrf限制的實例

    這篇文章主要介紹了django 取消csrf限制的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 關于Pycharm無法debug問題的總結

    關于Pycharm無法debug問題的總結

    今天小編就為大家分享一篇關于Pycharm無法debug問題的總結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解Python中元組的三個不常用特性

    詳解Python中元組的三個不常用特性

    元組是Python中一種重要的內置數(shù)據(jù)類型。與列表一樣,我們經(jīng)常使用元組將多個對象保存為相應的數(shù)據(jù)容器。本文為大家總結了元組的三個不常用特性,感興趣的小伙伴可以了解一下
    2022-07-07
  • 詳解Python列表賦值復制深拷貝及5種淺拷貝

    詳解Python列表賦值復制深拷貝及5種淺拷貝

    這篇文章主要介紹了Python列表賦值,復制,深拷貝以及5種淺拷貝詳解,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論

新蔡县| 图木舒克市| 恩平市| 黄大仙区| 盈江县| 富蕴县| 潼关县| 安陆市| 津南区| 鸡东县| 光泽县| 綦江县| 建平县| 文安县| 新泰市| 辽宁省| 临邑县| 建湖县| 莎车县| 沈丘县| 依安县| 灵武市| 新宁县| 呼玛县| 扎鲁特旗| 奎屯市| 临邑县| 昌平区| 达日县| 集安市| 囊谦县| 拜泉县| 连江县| 张掖市| 开化县| 定南县| 临猗县| 海丰县| 九龙县| 比如县| 福建省|