Захват MemoryError в Python?

Есть ли способ глобально исключить исключения MemoryError, чтобы библиотека могла очищать кеши, а не позволять MemoryError видеть код пользователя?

Я разрабатываю библиотеку кэширования памяти в Python, которая хранит очень большие объекты, до такой степени, что пользователям обычно нужно использовать всю доступную оперативную память, чтобы упростить их скрипты и / или ускорить их. Я бы хотел иметь крючок, где интерпретатор python запрашивает функцию обратного вызова, чтобы освободить некоторую ОЗУ как способ избежать вызова MemoryError в код пользователя.

  • Проблемы кэширования браузера в колбе
  • Jinja2 в Google App Engine
  • Хронические устаревшие результаты с использованием MySQLdb в Python
  • Memcached: поддержка автоматического обнаружения python на AWS Elasticache?
  • Почему uncompiled, многократно использовались регулярные выражения, намного медленнее в Python 3?
  • Python ленивый оценщик
  • ОС: Solaris и / или Linux

    Python: cPython 2.6. *


    EDIT: Я ищу механизм, который не будет обрабатываться за исключением блока. Если по какой-либо причине произошла ошибка памяти в любом коде, я бы хотел, чтобы интерпретатор Python попытался использовать обратный вызов для выпуска некоторой ОЗУ и никогда не генерировал исключение MemoryError. Я не контролирую код, который будет генерировать ошибки, и я хотел бы, чтобы мой кеш мог агрессивно использовать столько оперативной памяти, сколько захочет, автоматически освобождая оперативную память, как того требует код пользователя.

  • Размер данных в памяти по сравнению с диском
  • Измерьте размер объекта точно в Python - Sys.GetSizeOf не работает
  • Отслеживание * максимального использования памяти с помощью функции Python
  • Python: сокращение использования памяти словарем
  • Как прочитать файл csv объемом 6 ГБ с пандами
  • Модель памяти Python
  • 3 Solutions collect form web for “Захват MemoryError в Python?”

    Это не очень хороший способ управления памятью. К тому моменту, когда вы видите MemoryError, вы уже находитесь в критическом состоянии, когда ядро, вероятно, близко к процессам убийства, чтобы освободить память, а во многих системах вы никогда не увидите его, потому что оно пойдет на своп или просто OOM- убейте ваш процесс, а не сбои.

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

    Если вы хотите иметь кэш, который освобождает память по мере необходимости для других распределений, ему не нужно взаимодействовать с ошибками , а с самим распределителем. Таким образом, когда вам нужно освободить память для выделения, вы узнаете, сколько необходимой памяти требуется, иначе вы будете вслепую гадать. Это также означает, что вы можете отслеживать распределения памяти по мере их возникновения, поэтому вы можете сохранить использование памяти на определенном уровне, а не позволять ей расти неограниченно, а затем пытаться восстановить, когда она становится слишком высокой.

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

    MemoryError является MemoryError , вы должны уловить его в блок except .

    Хотелось бы, чтобы я мог прокомментировать ответ Гленна … хотя я согласен с общей идеей против использования MemoryException как способа обработки размера кеша, это не обязательно означает, что ваша система является нашей проблемой, когда вы их поймаете. Некоторые люди работают без свопа, и вы также можете получить их при использовании ulimit для ограничения максимального размера процесса. Кроме того, при использовании мягких пределов вы даже можете поднять мягкий предел, чтобы обрабатывать изящно, вы обрабатываете собственную смерть при исчерпании памяти (предполагая, что есть способ поднять ее, не выделяя больше памяти, я еще не пробовал это).

    Ловля неперехваченного исключения означает, что что-то пошло не так, и вы не знаете, что. Это означает, что ваше приложение может начать вести себя неожиданным образом, точно так же, как если бы вы начали удалять случайные строки кодов! Я использовал общий обработчик исключений в некоторых приложениях, но только для отображения приятного сообщения пользователю (особенно полезного с графическим интерфейсом) и отмирания.

    Вы можете подключить обработчик исключений следующим образом:

     sys.excepthook = <your_exceptionhook> 

    Параметры – это класс исключения, экземпляр исключения и объект трассировки. Вы можете передать эти параметры в том же порядке, что и traceback.format_exception (), чтобы генерировать сообщение трассировки python, записывающее stderr на неперехваченные исключения.

    NB: Я не пробовал, если он используется с ошибками MemoryException, но так вы поймаете исключенные исключения.

    Python - лучший язык программирования в мире.