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

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

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

4 ответа

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

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

Механизм ODE (DLL, которая вызывает проблему) использует alloca для ускорения больших матричных вычислений. К счастью, у него есть флаг компиляции, который позволяет мне переключать его на malloc. Это немного медленнее, но это работает. Спасибо!

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

Ещё вопросы

  • 0 JQuery UI панель / портлет плагин решение
  • 1 Проблема сериализации с Enums на Android
  • 1 Как получить доступ к встроенному классу ES6 во встроенном
  • 1 разобрать строку в JSON в узле JS Express
  • 1 Python ruamel.yaml сбрасывает теги с кавычками
  • 1 Карты Google — кластеризация маркеров с помощью нажимаемых маркеров
  • 0 пакет udp не получен в QThread
  • 0 Получение ответа от $ scope в angularjs
  • 1 Ориентация устройства Android Chrome перестает срабатывать, когда вкладка находится в фоновом режиме
  • 1 Как правильно изменить или удалить объект из области?
  • 0 Как мне создать массив этой структуры в C ++ 11?
  • 0 Проблема с повторяющимися кнопками поля формы
  • 0 DBCP XAMPP не принимает мой часовой пояс
  • 0 UI Grid бесконечная прокрутка для работы с полосой прокрутки браузера
  • 1 Robot Framework, расширяющий селен для обработки элемента нагрузки
  • 1 Обход XML-схем не удался
  • 0 Как добавить текст с пробелами для метки с помощью jquery?
  • 1 Как получить шаги из Google Fit API?
  • 0 Поиск данных в массиве, векторе, на карте и в списке
  • 0 Как использовать SOAP API с кодом входа в систему и сессией
  • 0 Почему статическая переменная класса не может быть размещена в стеке?
  • 0 Угловые флажки не связываются должным образом
  • 0 AngularJS Подтвердить выпадающий список на основе выбора переключателя
  • 0 Win32 использует макросы с параметрами для этого, что нарушает код C ++
  • 0 Сайт учебник, написанный на html / js?
  • 0 PHP Framework Zend не работает
  • 1 Офлайновые фрагменты в объемных данных
  • 0 Как поддерживать выбранные пользователем локали в приложении AngularJS
  • 0 Как восстановить привязки обработчиков событий в jQuery после частичной обратной передачи в salesforce?
  • 1 Как автоматически нажать кнопку ОК на JOptionPane при тестировании?
  • 0 Symfony отображает значение BLOB-объекта
  • 0 Числа 3, 5 и 7 не отображаются как простые
  • 0 Динамический контроллер
  • 1 чтение структуры каталогов и преобразование ее в объект JSON в Java
  • 0 JQuery обратный вызов, когда 3 метода завершены?
  • 0 Постоянный фон веб-страницы в CSS
  • 0 Использование языкового класса в контроллере (CodeIgniter)
  • 1 Невозможно вызвать тесты Cucumber для приложения Android на Java
  • 1 Поворот экрана с помощью ViewPager — проблема с FragmentManager и FragmentPagerAdapter
  • 1 Разница между getNamedItem () и getAttribute ()?
  • 0 Как реализовать скриптовые события для дизайна видеоигр?
  • 0 ссылка и указатель используются для полиморфизма? [Дубликат]
  • 1 Не удается открыть новый блокнот Python или R в студии машинного обучения Azure
  • 1 Есть ли в Javascript API более высокого уровня для доступа к файлам cookie?
  • 1 AppCenter Xamarin. Android успешно собирается и устанавливается на устройствах, но не запускается
  • 1 Как изменить статус релиза продукта на альфа / бета приложение для Android в Google Play
  • 1 Как объединить значения из групп в столбце в Python
  • 1 Панды: получить самые высокие значения во всем фрейме данных, а значения строки / столбца?
  • 0 Метод jQuery text ()
  • 0 Почему $ _POST не распознает определенные загруженные файлы?
Читайте также:  Label java перенос строки

Источник

Thread Stack Size in Python

You can retrieve and change the thread stack size via the threading.stack_size() function.

In this tutorial you will discover how to configure the thread stack size in Python.

What is a Thread Stack Size

Python code is compiled at runtime into Python bytecode and executed in the Python virtual machine.

Python source code is compiled into bytecode, the internal representation of a Python program in the CPython interpreter. […] This “intermediate language” is said to run on a virtual machine that executes the machine code corresponding to each bytecode.

— bytecode, Python Glossary.

The Python bytecodes are executed using a stack data structure that adds instructions as functions are called and pops instructions as they are executed, e.g. a so-called stack machine.

Each Python thread will have its own stack of instructions that are maintained and executed.

The size of the stack is fixed and is pre-allocated by the Python interpreter for each thread. This is so that the management and execution of instructions is fast.

The size of the stack may limit the number of instructions that can be maintained by a thread, such as the depth of a tree of function calls and the local variables maintained in those function calls. This is particularly an issue when a thread executes a single function recursively.

It is hard to nail down exact details of the Python thread stack and stack size details in the CPython interpreter, but a good place to start is here:

— Python Data model

Now that we know what the Python thread stack size is, let’s look at why we may change it.

Читайте также:  Css flex квадратные блоки

Run your loops using all CPUs, download my FREE book to learn how.

Why Change Thread Stack Size

Python will use a default thread stack size that is specific to your underlying operating system.

Note that some platforms may have particular restrictions on values for the stack size, such as requiring a minimum stack size > 32 KiB …

— threading — Thread-based parallelism

We may want to change the Python thread stack size in our program.

For example, we may have a large number of very simple worker threads that execute a single function with few local variables. In that case, we may want to set the thread stack size to the minimum value.

More likely, we may have one or more worker threads executing complex function call graphs. This might involve many small functions with many local variables and perhaps some functions called recursively.

In that case, we may want to increase the thread stack size. This may result in better performance for the threads given the stack size is pre-allocated, and may avoid stability problems if the interpreter imposes a hard limit on the size of a thread stack.

A limitation of a small thread stack size is that a program that requires a large thread stack size may result in a memory error resulting running out of space on the thread stack, called a stack overflow.

Now that we have some ideas on why we might adjust the stack size, let’s look at how we might do this.

Confused by the threading module API?
Download my FREE PDF cheat sheet

Читайте также:  Python подключение своих модулей

How To Get the Thread Stack Size

The thread stack size can be retrieved using the threading.stack_size() function.

Источник

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

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

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

4 ответа

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

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

Модуль потока Python позволяет указать новый размер стека для новых потоков. Попробуйте установить значение, которое, по вашему мнению, достаточно велико, а затем выполните работу этой 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 является пользовательским, то вы не можете разместить в куче, а не в стеке (или статически распределить, если необходимо), и таким образом решить проблему?

Источник

Оцените статью