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

Python跑循環(huán)時內(nèi)存泄露的解決方法

 更新時間:2020年01月13日 09:52:46   作者:L_W_T_  
這篇文章主要介紹了Python跑循環(huán)時內(nèi)存泄露的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Python跑循環(huán)時內(nèi)存泄露

今天在用Tensorflow跑回歸做測試時,僅僅需要循環(huán)四千多次 (補充說一句,我在個人PC上跑的)。運行以后,我就吃飯去了。等我回來后,Console窗口直接亮紅了?。?!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import tensorflow as tf
import matplotlib.font_manager as fm
myfont = fm.FontProperties(fname='C:/Windows/Fonts/simsun.ttc')
sess = tf.Session()

for j in range(0,4096):
  print('第' + str(j) + '次回歸')
  ......

此處忘了截圖,反正就是說Keras出現(xiàn)了什么什么錯誤。然后我就順手重啟了工程。

接著就瞪著屏幕,為什么跑一半出錯了???


這個時候我發(fā)現(xiàn)電腦管家的小火箭好像有點‘暴躁',打開任務(wù)管理器一看,果然。。。


Python占用內(nèi)存都快兩個G了,但是平時跑沒有占用這么多呀。我就猜想是不是因為跑循環(huán),內(nèi)存沒有釋放,導致最后溢出,然后code就崩了。

抱著猜想的心態(tài)等了一分鐘,然后。。


WTF 飆到兩千三百多兆的占用了。結(jié)論很明顯了,就是沒有釋放內(nèi)存!??!
這讓我想起來一個月前我在集群上并行GPU跑LSTM時,出現(xiàn)了Out of memory,


這是2080ti呀,足足十一個G的內(nèi)存,雖然當時我就用了一塊顯卡,但也不至于溢出吧。當時沒有想到是這個問題,現(xiàn)在回想一下十有八九就是沒有釋放內(nèi)存。

至于為什么沒有釋放內(nèi)存,那就要從下面這個人出生的時候說起了—>


還記得那是一個月黑風高夜晚,天空電閃雷鳴。。。。。。
hhh,開個玩笑,這個人是Python之父,不過我覺得接下來我要說的Python垃圾收集機制或多或少和他有一定的關(guān)系。

Python垃圾收集機制

現(xiàn)在的高級語言如java,c#等,都采用了垃圾收集機制,而不再是c,c++里用戶自己管理維護內(nèi)存的方式。自己管理內(nèi)存極其自由,可以任意申請內(nèi)存,但如同一把雙刃劍,為大量內(nèi)存泄露,懸空指針等bug埋下隱患。

對于一個字符串、列表、類甚至數(shù)值都是對象,且定位簡單易用的語言,自然不會讓用戶去處理如何分配回收內(nèi)存的問題。

python里也同java一樣采用了垃圾收集機制,不過不一樣的是:

python采用的是引用計數(shù)機制為主,標記-清除和分代收集兩種機制為輔的策略。

Python中的內(nèi)存管理過程非常簡單。Python通過保持對每個對象在程序中的引用計數(shù)來處理其對象,這意味著每個對象存儲在程序中被引用的次數(shù)。此計數(shù)隨程序運行時更新,并且當計數(shù)為零時,這意味著程序不再可訪問該計數(shù)。因此,解釋器可以回收和釋放該對象的內(nèi)存。

class User(object):
  def __del__(self):
    print("No reference left for {}".format(self))
user1 = User()
user2 = user1
user3 = user1

在此示例中,我們制作了一個類和3個引用變量指向同一對象。讓我們將其可視化:


現(xiàn)在,讓變量user1,user2和user3指向None而不是User實例。

>>> user1 = None
>>> user2 = None
>>> user3 = None
No reference left for <__main__.User object at 0x212bee9d9>

通過以上代碼,引用已更改為:


將最后一個變量分配user3給后None,該對象將被垃圾回收,這將調(diào)用該__del__函數(shù)。
從根本上講,每當引用對象時,Python對象的引用計數(shù)都會增加,而在取消引用對象時,Python的引用計數(shù)會減少。如果對象的引用計數(shù)為0,則將釋放該對象的內(nèi)存。您程序的代碼無法禁用Python的引用計數(shù)。

python跑循環(huán)為什么沒有釋放內(nèi)存

有些人認為,引用計數(shù)是A poor man's garbage collector 。很大一部分原因是它存在一些缺點,其中就包括無法檢測到循環(huán)應用。
如果在循環(huán)引用中的對象定義了__del__函數(shù),那么在循環(huán)引用中Python解釋器無法判斷析構(gòu)對象的順序,因此就不做處理,python gc不能進行回收。

解決辦法

在提出解決問題之前,我們要先找到問題。因為我這個Code需要畫圖,然后保存到本地。我就想是不是畫的圖導致占用過多內(nèi)存。

F_max = max(y_result)
plt.figure(figsize=(15, 5)) 
plt.subplot(131)
plt.scatter(Yp_data, Yt_data, alpha=0.8)
plt.title(u'回歸前結(jié)果',fontproperties=myfont)
plt.plot([0,F_max], [0,F_max], color = 'r')
  
plt.subplot(132)
plt.scatter(y_result, Yt_data, alpha=0.8)
plt.title(u'回歸后結(jié)果',fontproperties=myfont)
plt.plot([0,F_max], [0,F_max], color = 'r')
  
plt.subplot(133)
plt.plot(loss_vec, 'k-')
plt.title('loss per Generation')
plt.xlabel('Generation')
plt.ylabel('Loss')
plt.savefig('D:/lwt/py/Regression/figure/{} .png'.format(_type), dpi=100)
plt.show()

有想法你就要去做是吧,然后我就加了兩行代碼。

plt.close('all')
plt.clf() 

這兩句是用來清除內(nèi)存中的圖像和清理掉 axes,并且為了盡可能的減少內(nèi)存占用,把plt.show()都刪除了
然后運行Code,打開任務(wù)管理器,測試是否管用。
貌似python占用的內(nèi)存是沒有之前上升的那么快了,不知道是不是心理作用hh。反正效果不明顯,看來得從別的地方下手了。
排除掉這個可能,那就是回收機制的鍋了。既然你不主動,那我就主動點咯(猿式陰笑嘿嘿)。

for x in list(locals().keys())[:]:
  del locals()[x]
gc.collect()

for循環(huán)就不要過多解釋了,先說del 語句的用法

del obj_name

del是一個Python關(guān)鍵字。而且,obj_name 可以是變量,用戶定義的對象,列表,列表中的項,字典等??梢杂脕韯h除用戶定義的對象;刪除變量,列表和字典;從列表中刪除項目和切片;從字典中刪除鍵等等。具體用法大家可以查找相關(guān)文檔了解。

gc是python的垃圾回收器接口,gc.collect(generation=2)若被調(diào)用時不包含參數(shù),則啟動完全的垃圾回收??蛇x的參數(shù) generation 可以是一個整數(shù),指明需要回收哪一代(從 0 到 2 )的垃圾。當參數(shù) generation 無效時,會引發(fā) ValueError 異常。返回發(fā)現(xiàn)的不可達對象的數(shù)目。每當運行完整收集或最高代 (2) 收集時,為多個內(nèi)置類型所維護的空閑列表會被清空。 由于特定類型特別是 float 的實現(xiàn),在某些空閑列表中并非所有項都會被釋放。

實測,有明顯的效果,內(nèi)存占用上升的速度明顯減小了,不過總體還是承上升的趨勢。相比之前,好太多了有沒有。
方法總比困難多,解決內(nèi)存泄漏也還有其他的辦法。我們還可以用objgraph、weakref等工具來分析并解決內(nèi)存泄露、循環(huán)引用問題。實在不行,還有一個超級硬核的辦法,自己動手寫一個騰訊電腦管家小火箭的腳本,時不時的讓它上上天(騰訊記得打錢啊啊?。?。哈哈哈

在任何環(huán)境,不管是服務(wù)器,客戶端,內(nèi)存泄露都是非常嚴重的事情。如果是線上服務(wù)器,那么一定得有監(jiān)控,如果發(fā)現(xiàn)內(nèi)存使用率超過設(shè)置的閾值則立即報警,盡早發(fā)現(xiàn)些許還有救。

新的問題

不要強行收集垃圾太多次。這是因為,即使要釋放內(nèi)存,仍然需要花費時間來評估對象是否符合垃圾收集條件。我在實測中的確發(fā)現(xiàn)運行速度有些下降。
還有就是他會把全局的變量都刪了,以至于出現(xiàn)nppd等導入的包都not defined。我的建議是把循環(huán)寫到函數(shù)里,做到只對某個函數(shù)起作用。

筆者作為一個學生也是剛接觸python不久,如有不對的地方還請指正,謝謝~

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

相關(guān)文章

  • python import 上級目錄的導入

    python import 上級目錄的導入

    這篇文章主要介紹了python import 上級目錄的導入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 解決pycharm運行出錯,代碼正確結(jié)果不顯示的問題

    解決pycharm運行出錯,代碼正確結(jié)果不顯示的問題

    今天小編就為大家分享一篇解決pycharm運行出錯,代碼正確結(jié)果不顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python+pandas+時間、日期以及時間序列處理方法

    python+pandas+時間、日期以及時間序列處理方法

    今天小編就為大家分享一篇python+pandas+時間、日期以及時間序列處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python高級內(nèi)置函數(shù)用法實例

    python高級內(nèi)置函數(shù)用法實例

    在本篇文章里小編給大家整理的是一篇關(guān)于python高級內(nèi)置函數(shù)用法實例內(nèi)容,有興趣的朋友們可以學參考下。
    2021-09-09
  • pyecharts繪制儀表盤的實現(xiàn)

    pyecharts繪制儀表盤的實現(xiàn)

    有時候大家想把自己繪制好的可視化圖片集中到一個頁面,整合成儀表盤,集中給同事或者他人來呈現(xiàn),但又不知道該怎么做,今天小編就來分享一個pyecharts繪制儀表盤的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2021-06-06
  • pytorch保存和加載模型的方法及如何load部分參數(shù)

    pytorch保存和加載模型的方法及如何load部分參數(shù)

    本文總結(jié)了pytorch中保存和加載模型的方法,以及在保存的模型文件與新定義的模型的參數(shù)不一一對應時,我們該如何加載模型參數(shù),對pytorch保存和加載模型相關(guān)知識感興趣的朋友一起看看吧
    2024-03-03
  • python的類方法和靜態(tài)方法

    python的類方法和靜態(tài)方法

    這篇文章主要介紹了python的類方法和靜態(tài)方法,以實例形式分析了Python中類方法和靜態(tài)方法的實現(xiàn)技巧與應用方法,需要的朋友可以參考下
    2014-12-12
  • 超級詳細實用的pycharm常用快捷鍵

    超級詳細實用的pycharm常用快捷鍵

    本文詳細總結(jié)了Pycharm的常用快捷鍵,下文介紹使用方法和場景, 并不需要記憶這些快捷鍵, 你只需要知道有這些快捷鍵, 再需要用的時候查看一下, 用的多了自然也就記住了,需要的朋友可以參考下
    2021-05-05
  • Python實現(xiàn)微信自動回復信息的功能(根據(jù)不同信息回復對應的信息)

    Python實現(xiàn)微信自動回復信息的功能(根據(jù)不同信息回復對應的信息)

    這篇文章主要介紹了Python實現(xiàn)微信自動回復信息的功能(根據(jù)不同信息回復對應的信息),我們使用的第三方包是UIAutomation,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • Python基礎(chǔ)之標準庫和常用的第三方庫案例教程

    Python基礎(chǔ)之標準庫和常用的第三方庫案例教程

    這篇文章主要介紹了Python基礎(chǔ)之標準庫和常用的第三方庫案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論