我已經在我的n-body模擬器中實現了「Barnes-Hut」算法,並且遇到了問題。Barnes-Hut和遞歸限制
我的程序會崩潰,內存相關異常,主要是stack overflow
異常。
這使得這個奇怪的錯誤接收的事情是,它不會發生在固定的時間,它似乎是出來的藍色。使用任務管理器,我可以清楚地看到沒有內存泄漏,我一直非常小心地避免這種情況。我雖然這樣做,使用遞歸,並在對象中的對象。
是否有可能需要包含最大深度的八叉樹,這是什麼導致錯誤?
我已經在我的n-body模擬器中實現了「Barnes-Hut」算法,並且遇到了問題。Barnes-Hut和遞歸限制
我的程序會崩潰,內存相關異常,主要是stack overflow
異常。
這使得這個奇怪的錯誤接收的事情是,它不會發生在固定的時間,它似乎是出來的藍色。使用任務管理器,我可以清楚地看到沒有內存泄漏,我一直非常小心地避免這種情況。我雖然這樣做,使用遞歸,並在對象中的對象。
是否有可能需要包含最大深度的八叉樹,這是什麼導致錯誤?
最大遞歸深度的確受到堆棧大小的限制。
堆棧大小爲而不是與您的完全RAM內存大小相同。例如:
例如。在Windows上,默認堆棧大小(每個線程)爲1MB,僅此而已。
可以爲程序重新配置它,和/或在沒有整個程序崩潰的情況下「捕捉」堆棧溢出錯誤(後者相當髒,但至少可能)。
儘管如此,最好的解決方案將是修改後的代碼來擺脫這種遞歸。所有的遞歸都可以用迭代解決方案替代,但它可能會更復雜一些。每個函數調用的數據可以移動到一個矢量等每個調用一個入口,以便動態分配的矢量內存可以使用整個RAM。
爲oct-tree添加了最大深度,爲遞歸函數的最大深度添加了最大深度,我沒有再發生崩潰。 –
你能顯示代碼嗎?如果你使用遞歸,其深度取決於Oct樹的深度,那麼是的,這可能是問題。你的樹有多深?你可以將算法轉換爲命令式的版本嗎? –