1. 程式人生 > >爬蟲問題一:棧溢位(stack overflow)問題解決方案

爬蟲問題一:棧溢位(stack overflow)問題解決方案

在爬取某個網頁的時候遇到了這個問題:

Fatal Python error: Cannot recover from stack overflow

我問題所在:使用函式時遞迴呼叫次數過多(800左右會出現),導致棧溢位。

在Python中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,相當於一次push壓棧操作,每當函式返回,相當於一次pop出棧操作。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。

Windows程式的記憶體機制大概是這樣的,全域性變數(區域性的靜態變數本質也屬於此範圍)儲存於堆記憶體,該段記憶體較大,一般不會溢位;函式地址、函式引數、區域性變數等資訊儲存於棧記憶體,棧記憶體較小容易發生溢位現象,但是效率高。

棧溢位的可能原因:
1. 函式遞迴呼叫層次過深 ,每呼叫一次,函式的引數、區域性變數等資訊就壓一次棧,並且沒有及時出棧。
2. 區域性變數體積太大

可以通過下面這張圖來輔助我們理解,當棧的空間接近被佔完時,會發生溢位現象

還在路上,稍等...

解決方案:
1.把遞迴呼叫函式改用while或者for迴圈來實現
2.通過尾遞迴優化
3.改用堆記憶體,函式裡定義很大的區域性變數(例如大陣列),這種情況可以將區域性變數改為靜態變數(實質上也是全域性變數)。
4.增大棧的大小值