哪些操作會導致Python內存溢出,怎麼處理?

Nicycycy


你好,感謝你的提問,剛好前段時間我也遇到過Python內存溢出的情況。我把我的例子與你分享,希望對你有所幫助。

內存溢出的情況:你使用malloc或new向 內存申請了一塊內存空間,但沒有用free以及delete對該塊內存進行釋放,造成程序失去了對該塊內存的控制。

我的處理辦法是:

在原生的編譯器中,如果進行如下定義

a=1000

b=1000

print id(a),id(b)

會發現,兩個的結果是不同的。id()是用來查看對象的內存地址的,如果我們定義大量的int變量,就有了內存溢出的可能性。

查了下,python對於小整數對象,[-5, 257),是預分配內存地址的。如果超出這個範圍則使用通用的緩衝池,對於大整數則有PyIntBlock,用來作緩衝池。所以出現了我們上述的現象。

對int類變量值相同的情況,如果使用a=b=1000來定義,id(a)和id(b)的內存地址就是同一個了,可以一定程度上降低溢出的可能。

非原生的編譯器中,貌似對上述情況進行過優化。在eclipse中測試,同樣值,通常都是同一個內存地址。





往日好食光


內存溢出

內存溢出(Out Of Memory,簡稱OOM)是指應用系統中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於能提供的最大內存。此時表現為程序無法運行,系統提示內存溢出,有時甚至會自動關閉軟件。


Python 內存溢出原因概括:

  1. 內存中加載的數據量過於龐大,比如一次性從數據庫取出的數據量過大;

  2. 引用多個對象後,未進行清空操作,仍一直佔用內存;

  3. 代碼中存在死循環或循環產生過多重複的對象實體(同二);

  4. 引用的第三方模塊存在BUG;

  5. 啟動參數內存值設定過小。


解決方法:

Python 內存溢出的解決方法,主要是根據內存溢出的具體原因來進行,有如下:

  1. 檢查程序項目中是否存在從數據庫中一次性獲得大量數據的查詢操作(最好採用分頁方式進行查詢);

  2. 檢查程序項目中是否存在死循環或遞歸調用;

  3. 檢查程序項目中是否存在因循環而重複產生的新對象實體;

  4. 檢查程序項目中是否存在使用定義對象後未清空的現象;

  5. 使用內存查看工具動態查看內存使用情況,實時監測。

總結:

“內存溢出”這一現象貫穿於整個軟件開發史,是每個程序開發人員都應該重視和注意的地方,其引發的問題可大可小,不容忽視。作為一個合格的編程開發人員,應該養成一個好的編程習慣,比如:引用對象後應及時釋放內存。這樣一來,就可大大降低發生內存溢出的可能性。


如果喜歡,可以關注我,謝謝!


分享到:


相關文章: