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

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

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

4 ответов


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

EDIT: Correction-Python позволяет устанавливать размер стека при создании новых потоков (см. нить.stack_size)


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


Как отмечено в некоторых связанных вопросах как тут, как правило, не рекомендуется играть с размером стека, чтобы расширить глубину рекурсии, но вот код, который показывает, как увеличить стек до этого эффекта. С 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()

`


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

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