Как мне увеличить размер стека в Python
У меня есть программа на Python, которая использует специально созданную DLL. Эта DLL падает из-за переполнения стека. Это переполнение происходит не из-за плохой рекурсивной функции, а из-за больших выделений в стеке с использованием alloca().
Я хочу увеличить размер стека, чтобы избавиться от этой ошибки. Есть какой-либо способ сделать это?
4 ответа
AFAIK программа может изменять только размер стека новых потоков или процессов (например, функция Windows CreateThread). Поскольку Python (и Win32 API для Python) не предоставляет такой функциональности, вам лучше заменить выделение стека кучей памяти. Или есть конкретная причина для использования стека?? Если вы действительно должны использовать alloca Возможно, вы захотите создать отдельный поток для выполнения кода DLL (я думаю, это излишне).
РЕДАКТИРОВАТЬ: Исправление — Python позволяет устанавливать размер стека при создании новых потоков (см. Thread.stack_size)
Модуль потока Python позволяет указать новый размер стека для новых потоков. Попробуйте установить значение, которое, по вашему мнению, достаточно велико, а затем выполните работу этой DLL в новом потоке.
Как увеличить размер стека python
This sys module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter. It provides information about constants, functions and methods of python interpreter. It can be used for manipulating Python runtime environment.
sys.setrecursionlimit() method is used to set the maximum depth of the Python interpreter stack to the required limit. This limit prevents any program from getting into infinite recursion, Otherwise infinite recursion will lead to overflow of the C stack and crash the Python.
Note: The highest possible limit is platform-dependent. This should be done with care because too-high limit can lead to crash.
Syntax: sys.setrecursionlimit(limit)
Parameter:
limit: It the value of integer type that denotes the new limit of python interpreter stack.
Return Value: This method returns nothing.
Как увеличить размер стека в Python
У меня есть программа на Python, которая использует специально созданную DLL. Эта DLL аварийно завершает работу из-за переполнения стека. Это переполнение происходит не из-за того, что рекурсивная функция испортилась, а из-за больших выделений в стеке с помощью alloca ().
Я хочу увеличить размер стека, чтобы избавиться от этой ошибки. Есть какой-либо способ сделать это?
4 ответы
AFAIK программа может изменять только размер стека новых потоков или процессов (Windows ‘ CreateThread функция, например). Поскольку Python (и Win32 API для Python) не предоставляет такую функциональность, вам лучше заменить выделение стека памятью кучи. Или есть конкретная причина для использования стека ?? Если ты действительно иметь использовать alloca вы можете создать отдельный поток для выполнения кода DLL (что, я думаю, излишне).
EDIT: Исправление — Python позволяет устанавливать размер стека при создании новых потоков (см. thread.stack_size)
Механизм ODE (DLL, вызывающая проблему) использует alloca для ускорения вычислений больших матриц. К счастью, у него есть флаг компиляции, который позволяет мне переключить его на malloc. Немного медленнее, но работает. Спасибо! — Филипп Бодуан
Питон модуль потока позволяет указать новый размер стопки для новых тем. Попробуйте установить для него значение, которое, по вашему мнению, достаточно велико, а затем выполните работу этой DLL в новом потоке.

Как отмечено в некоторых связанных вопросах как здесь, как правило, не рекомендуется играть с размером стека для увеличения глубины рекурсии, но вот код, который показывает, как с этой целью увеличить стек. С python 3.5 в системе Windows 10 x64 он демонстрирует очень глубокую рекурсию, которая обычно невозможна (обычно допустимый предел рекурсии в моей ситуации составляет 993). Я не знаю, насколько большим должен быть стек для этого примера, но на моей машине с половиной указанного ниже размера происходит сбой python.
ответ дан 18 дек ’18, 15:12

Функции в dll не могут контролировать размер стека, доступный при их выполнении (если вы не создаете новые потоки под управлением вашей библиотеки).
Если dll является настраиваемой, то разве вы не можете выделить в куче, а не в стеке (или статически выделить, если необходимо), и таким образом решить проблему?
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками python dll stack or задайте свой вопрос.
What Is the Maximum Recursion Depth in Python
The maximum recursion depth in Python is 1000.
You can verify this by calling sys.getrecursionlimit() function:
You can change the limit by calling sys.setrecursionlimit() method.
Consider this a dangerous action!
If possible, instead of tweaking the recursion limit, try to implement your algorithm iteratively to avoid deep recursion.
Python Maximum Recursion Depth Exceded in Comparison
Whenever you exceed the recursion depth of 1000, you get an error in Python.
For example, if we try to compute a too large Fibonacci number, we get the recursion depth error.
This error says it all—maximum recursion depth exceeded in comparison. This tells you that Python’s recursion depth limit of 1000 is reached.
But why is there such a limit? More importantly, how can you overcome it?
Let’s answer these questions next.
Why Is There a Recursion Depth Limit in Python
A recursive function could call itself indefinitely. In other words, you could end up with an endless loop.
Also, a stack overflow error can occur even if the recursion is not infinite. This can happen due to too big of a stack frame.
In Python, the recursion depth limit takes these risks out of the equation.
Python uses a maximum recursion depth of 1000 to ensure no stack overflow errors and infinite recursions are possible.
This recursion limit is somewhat conservative, but it is reasonable as stack frames can become big in Python.
What Is a Stack Overflow Error in Python
Stack overflow error is usually caused by too deep (or infinite) recursion.
This means a function calls itself so many times that the space needed to store the information related to each call is more than what fits on the stack.
How to Change the Recursion Depth Limit in Python—Danger Zone!
You can change the maximum recursion depth in Python. But consider it a dangerous action.
To do this, call the sys.setrecursionlimit() function.
For example, let’s set the maximum recursion depth to 2000 :
Temporarily Change the Recursion Depth Limit in Python
Do you often need to tweak the recursion depth limit in your project?
If you do, consider using a context manager. This can improve the quality of your code.
For example, let’s implement a context manager that temporarily switches the recursion limit:
Now you can temporarily change the recursion depth to perform a recursive task.
When this operation completes, the context manager automatically switches the recursion depth limit back to the original value.