2016-02-13 124 views
3

簡短問題:我有一個javascript,它在遞歸中非常深入。我如何增加堆棧大小以便我可以執行它(類似於Unix系統中的「ulimit -s unlimited」)?在瀏覽器中增加堆棧大小

長篇小說:我必須繪製圖形,並使用Cytoscape JS(http://js.cytoscape.org/)和Dagre佈局擴展(https://github.com/cytoscape/cytoscape.js-dagre)。繪圖算法深入到遞歸中,我最終在Chrome中獲得了「Uncaught RangeError:最大調用堆棧大小」和Firefox中的「太多遞歸」。如何將堆棧大小設置爲無限或非常大(即像Unix系統中的「ulimit -s unlimited」),以便我可以繪製圖形?

謝謝!

+0

找到你確定你的算法是正確的?您是否計算了您在離開堆棧空間時的嵌套調用數?這是一個合理的數字嗎? – trincot

+0

是的,算法是正確的。事情是這個圖有點大,繪圖算法在遞歸中深入。但是,使用其他繪圖算法(不使用遞歸),我可以很快地繪製它...因此,我認爲如果我可以將堆棧大小增加到相當大的大小,我將能夠繪製它。我搜索了,但找不到任何答案......在最糟糕的情況下,我需要修改Dagre算法,將其從遞歸更改爲迭代...但我想檢查是否有任何設置堆棧的方式瀏覽器的JavaScript引擎的大小限制。 – iwicopd2

+1

添加更多的上下文,在這裏你可以找到幾個瀏覽器的堆棧大小限制:http://stackoverflow.com/questions/7826992/browser-javascript-stack-size-limit?rq=1。我只需要增加這個限制。 – iwicopd2

回答

1

嘗試更改您的算法,以避免在函數的每次迭代中使用盡可能多的堆棧空間。例如:

  • 未使用時將局部變量設置爲空。
  • 儘可能使用全局變量進行臨時計算。那樣,那個臨時變量不會在堆棧上。
  • 在遞歸函數中使用較少的變量。在函數的不同部分重複使用相同的變量來處理不同的事情。
  • 將您的遞歸函數分解爲幾個函數。其中一些函數不會遞歸,因此這些函數中的局部變量在遞歸函數自行調用時不會繼續。
  • 創建一個全局數組並將其添加到此列表中,而不是遞歸地調用一個函數。使用array()對象的push和pop方法。
  • 遞歸函數的參數較少。改爲傳遞一個對象。

我希望這些想法對您有所幫助。

+0

你好。謝謝你的答案。我曾考慮過其中的一些內容,但是您的列表確實比較完整!然而,如果我儘可能地減少每個函數調用的堆棧空間,但是算法本身在遞歸中過深,我不能改變爲迭代算法?即我真的需要增加堆棧大小?我在現代瀏覽器中無法做到這一點?我是否應該將腳本重新編碼爲桌面應用程序,以便能夠擁有龐大的堆棧大小? – iwicopd2

+0

我在Windows中編程一次,並且有一個非常大的二叉樹。一旦函數完成,我寫了一個遞歸函數來刪除樹。遞歸函數會崩潰。我不得不將遞歸函數重寫爲迭代函數。我不認爲改變語言或擴大堆棧可以解決算法問題。如果您將堆棧大小加倍或堆棧大小加倍,那麼您可能仍會遇到同樣的問題。 –

+0

你好。我正在使用第三方庫,並且在遞歸中有很多功能深入。我爲此改變整個圖書館是不切實際的。我也同意並且喜歡以遞歸方式迭代地編寫代碼,但有時候遞歸只是在算法上更清晰。在UNIX系統中,有時候我們會有這個,而ulimit -s unlimited將解決這個問題。我現在有一個替代js的解決方法,它涉及到通過用--js-flags =「 - stack_size x」命令行參數調用Google Chrome來改變堆棧大小,並使用大的x。非常感謝你的幫助。 – iwicopd2