Как мне увеличить размер стека в Python - PullRequest
7 голосов
/ 15 января 2010

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

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

Ответы [ 4 ]

7 голосов
/ 15 января 2010

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

4 голосов
/ 12 ноября 2015

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

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

2 голосов
/ 15 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...