Как увеличить размер стека python

от admin

Как мне увеличить размер стека в Python

У меня есть программа на Python, которая использует специально созданную DLL. Эта DLL падает из-за переполнения стека. Это переполнение происходит не из-за плохой рекурсивной функции, а из-за больших выделений в стеке с использованием alloca ().

Я хочу увеличить размер стека, чтобы избавиться от этой ошибки. Есть какой-либо способ сделать это?

4 ответа

AFAIK, программа может изменять только размер стека новых потоков или процессов например, функция «nofollow noreferrer»> CreateThread ). Поскольку Python (и Win32 API для Python) не предоставляет такой функциональности, вам лучше заменить выделение стека кучей памяти. Или есть конкретная причина для использования стека ?? Если вы действительно должны использовать alloca , вы можете создать отдельный поток для выполнения кода DLL (я думаю, это излишне).

РЕДАКТИРОВАТЬ . Исправление — Python позволяет устанавливать размер стека при создании новых потоков (см. thread.stack_size)

Функции в dll не могут контролировать размер стека, доступного при их выполнении (если только вы не создаете новые потоки под управлением вашей библиотеки).

Если dll является пользовательским, то вы не можете разместить в куче, а не в стеке (или статически распределить, если это уместно), и таким образом решить проблему?

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

модуль потока Python позволяет указать новый размер стека для новых потоков. Попробуйте установить значение, которое, по вашему мнению, достаточно велико, и затем выполните работу этой DLL в новом потоке.

Setting stacksize in a python script

I am converting a csh script to a python script. The script calls a memory-intensive executable which requires a very large stack, so the csh script sets the stacksize to unlimited:

When I try to reproduce this script in python, I execute them in a very naive manner, using os.system , e.g.:

But I do not know how to tell the OS to run these executables with unlimited stacksize. Is there a way to specify stacksize for calls within a python script? Is there some low-level system call that I should be using? And is there a module (similar to shutil) which controls this?

Как увеличить размер стека в Python

У меня есть программа на Python, которая использует специально созданную DLL. Эта DLL аварийно завершает работу из-за переполнения стека. Это переполнение происходит не из-за того, что рекурсивная функция испортилась, а из-за больших выделений в стеке с помощью alloca ().

Я хочу увеличить размер стека, чтобы избавиться от этой ошибки. Есть какой-либо способ сделать это?

Читать:
Что такое ajax fetch

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 задайте свой вопрос.

Как увеличить размер стека 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.

Похожие статьи