如何增加python中的堆栈大小

Posted

技术标签:

【中文标题】如何增加python中的堆栈大小【英文标题】:How do I increase the stack size in python 【发布时间】:2011-01-05 06:35:57 【问题描述】:

我有一个使用定制 DLL 的 python 程序。此 DLL 由于堆栈溢出而崩溃。这种溢出不是由于递归函数坏了,而是由于使用 alloca() 在堆栈上进行了大量分配。

我想增加堆栈大小以消除此错误。有没有办法做到这一点?

【问题讨论】:

如果可以改源码,见***.com/questions/5061582/… 【参考方案1】:

dll 中的函数在执行时无法控制可用的堆栈大小(除非您在库的控制下生成新线程)。

如果 dll 是自定义的,那么您不能在堆而不是堆栈上分配(或静态分配,如果合适的话),并以这种方式停止问题吗?

【讨论】:

【参考方案2】:

AFAIK 程序只能更改新线程或进程的堆栈大小(例如,Windows 的 CreateThread 函数)。由于 Python(以及 Python 的 Win32 API)没有公开此类功能,因此您应该将堆栈分配替换为堆内存。还是有使用堆栈的特定原因?如果您真的必须使用alloca,您可能需要创建一个单独的线程来执行 DLL 代码(我认为这太过分了)。

编辑:更正 - Python 允许在创建新线程时设置堆栈大小(请参阅thread.stack_size)

【讨论】:

ODE 引擎(导致问题的 DLL)使用 alloca 来加速大型矩阵计算。幸运的是,它有一个编译标志,可以让我将它切换到 malloc。它有点慢,但它有效。谢谢!【参考方案3】:

python thread module 允许您为新线程指定一个新的stack size。尝试将其设置为您认为足够大的值,然后在新线程中执行此 DLL 的工作。

【讨论】:

【参考方案4】:

正如在一些相关问题like here 中所指出的,使用堆栈大小来扩展递归深度通常不是一个好主意,但这里的代码显示了如何使堆栈增长到这种效果。使用 python 3.5,在 Windows 10 x64 系统上,它演示了一个非常深的递归,这通常是不可能的(在我的情况下,通常允许的递归限制似乎是 993)。我不知道这个例子的堆栈实际上有多大,但是,在我的机器上,当大小只有下面指定的一半时,python 崩溃了。

import sys
import threading

class SomeCallable:
    def __call__(self):
        try:
            self.recurse(99900)
        except RecursionError:
            print("Booh!")
        else:
            print("Hurray!")
    def recurse(self, n):
        if n > 0:
            self.recurse(n-1)

SomeCallable()() # recurse in current thread

# recurse in greedy thread
sys.setrecursionlimit(100000)
threading.stack_size(0x2000000)
t = threading.Thread(target=SomeCallable())
t.start()
t.join()

【讨论】:

以上是关于如何增加python中的堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试增加 Visual Studio 2017 中的堆栈大小

有没有办法增加c#中的堆栈大小?

使用mingw编译时增加堆栈大小?

在 python 2.7 中增加递归限制和堆栈大小

在 C++ 中增加堆栈大小

如何增加 Python 中的最大递归深度? [复制]