Barnes Hut和递归极限

Barnes-Hut and recursion limit

本文关键字:极限 递归 Hut Barnes      更新时间:2023-10-16

我在n-body模拟器中实现了"Barnes Hut"算法,遇到了一个问题。

我的程序将崩溃,出现与内存相关的异常,主要是stack overflow异常。

这是一个奇怪的错误,因为它不是在固定的时间发生的,它似乎是突如其来的。使用任务管理器,我可以清楚地看到没有内存泄漏,我一直非常小心地避免这种情况。尽管如此,我还是使用递归,并将对象与in对象一起使用。

我是否可能需要包括oct树的最大深度,这就是导致错误的原因?

最大递归深度确实受到堆栈大小的限制
堆栈大小是而不是与您的完整RAM内存大小相同
例如,在Windows上,默认的堆栈大小(每个线程)是1MB,仅此而已。

可以为您的程序重新配置它,和/或在不导致整个程序崩溃的情况下"捕获"堆栈溢出错误(后者相当脏,但至少是可能的)。

尽管如此,最好的解决方案是修改代码以消除递归。所有递归都可以用迭代解决方案代替,但可能会更复杂一些。每个函数调用的数据都可以移动到一个向量等中,每个调用一个条目,这样动态分配的向量内存就可以使用整个RAM。