У меня есть приложение на python, которое использует много памяти, что должно быть хорошо, поскольку я обрабатываю его в цикле с try / except MemoryError
. К сожалению, исключение MemoryError никогда не возникает - до того, как это произойдет, python будет убит (в Debian Linux) убийцей OOM.
Вопрос в том, почему ... и как я могу поймать ошибку в Python. Если я могу поймать это, у меня есть легкое смягчение, но без исключения я не могу вызвать мое смягчение.
Для информации, приложение обрабатывает видео, каждый кадр размером около 15 МБ. Если мне не хватает памяти, я с удовольствием уменьшу частоту кадров и попробую снова.
Я также пытался отслеживать использование памяти при загрузке каждого кадра, используя psutil.available, но процесс завершается с ~ 350 МБ, показывающими как доступную память (всего 2 ГБ). Я полагаю, это проблема фрагментации.
Поэтому у меня есть проблема в том, что я могу произвольно установить некоторые ограничения, например, если я получу <500 МБ свободной памяти, то начну снова с более низкой частотой кадров, но все это кажется немного произвольным и не очень устойчивым. Если приложение или, возможно, операционная система или аппаратное обеспечение изменится, я могу обнаружить, что в следующий раз оно выйдет из строя на оставшихся 501 МБ или что-то в этом роде ... поэтому я бы предпочел обработать его с помощью исключения MemoryError. </p>
К сожалению, это, похоже, не является общей проблемой, так как «исключение вызвано Python oom-killer» дает мне только две страницы результатов поиска Google! В основном ответом здесь было «не используйте столько памяти», что не очень полезно - в моем случае я хочу использовать столько, сколько доступно, но с удовольствием использую меньше, если мне нужно. Просто тот Питон не дает мне возможности сделать это прежде, чем его убьют!
Любые мысли с благодарностью.