我有一個遞歸函數,可用於調用堆棧深度高達1000的輸入,但對於較大的輸入會失敗。我將函數轉換爲尾遞歸,並使其達到大約1350.遞歸調用堆棧深度
有什麼限制,有什麼辦法來增加這個限制嗎?
我正在使用純函數,並希望避免必須使用操作。我有一個解決方案,將問題分解爲步驟組合,每個步驟的堆棧深度都較小,但是它的設計很有意思,因爲它的唯一目的是避免這個問題,而且它更復雜。
我有一個遞歸函數,可用於調用堆棧深度高達1000的輸入,但對於較大的輸入會失敗。我將函數轉換爲尾遞歸,並使其達到大約1350.遞歸調用堆棧深度
有什麼限制,有什麼辦法來增加這個限制嗎?
我正在使用純函數,並希望避免必須使用操作。我有一個解決方案,將問題分解爲步驟組合,每個步驟的堆棧深度都較小,但是它的設計很有意思,因爲它的唯一目的是避免這個問題,而且它更復雜。
這又是我的錯誤... Java堆棧的設置是-Xss(-Xms設置是起始堆大小),對不起。因此,如果您在啓動器的「調試器」選項卡中使用JVM參數部分,並設置了類似-Xss5m的內容,則應該進一步完善。
在一個遞歸函數的簡單實驗中,默認堆棧允許深度爲227個調用。使用-Xss5m給了我4020個呼叫,-Xss10m給了我8050個呼叫。請注意,這些堆棧大小比您嘗試的Gb大小要小一些 - 5Mb的堆棧大量調用!
Overture不會對底層Java堆棧限制施加堆棧限制,所以它只會簡單地遵循-Xms JVM參數。我認爲解釋器的常規執行堆棧來自Overture.ini文件(頂層),您可以在其中看到用於設置最大堆的-Xmx參數。你可以嘗試添加(比如說)-Xms128m,或者你選擇的大小,看看是否讓你更進一步?
我試過-Xms和-Xmx都設置爲2048m,但沒有任何影響。我也在Mac OSX和Windows 10上嘗試過Overture 2.3.0,結果相同。
把我的項目圈外的,我創建了一個新的項目,一個很簡單的功能:
countdown(n:nat) res:nat
== if n=0 then n else countdown(n-1)
在Windows和Mac我可以值807調用此並獲得成功,同時與808它失敗,錯誤:
internal error
Main 206: Error evaluating code
Detailed Message: internal error
好的,可能是解釋器沒有使用Overture.ini的堆棧大小 - 對不起,工具內部並不是我的區域(我擔心語言本身)。我會與團隊覈對。一個2Gb的堆棧是巨大的,所以顯然這個設置沒有效果。 –
這聽起來像你詢問如何增加Java堆棧限制在序曲調試器,而不是在序曲IDE(overture.ini)。
要更改傳遞附加參數,你需要將它們添加到啓動配置中的序曲調試器:
啊是的!謝謝Kenneth :) –
不幸的是,這並沒有解決我的問題。即使使用「-Xmx4096m -Xms4096m」作爲調試器參數,我也會得到相同的錯誤。在Windows和Mac上也有相同的結果。 – Paul
非常感謝尼克。這解決了這個問題。現在沒問題。 – Paul