2016-12-14 5 views
0

Иногда программа Python останавливается с исключением, как в дальнейшем, когда не хватает памяти:Как я могу заставить Python ждать, когда он не может выделить память?

OSError: [Errno 12] Cannot allocate memory 

Могу ли я подождать, пока память не будет доступна снова вместо того, чтобы умереть Неустранимый? Или, по крайней мере, заморозить, пока пользователь не отправит SIGCONT или что-то в этом роде?

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

Спасибо!

+0

Готовы ли вы выполнять низкоуровневое программирование, например, писать библиотеку C для использования с 'LD_PRELOAD'? Или вы хотите чистое решение Python? Это на Linux? –

+0

@JohnZwinck Благодарим за комментарий. На самом деле я не хочу делать низкоуровневые вещи, например, перехватывать. Так чистое решение Python было бы лучше. Да, это на Ubuntu. – noname

+0

@JohnZwinck Просто пояснить: «Я не хочу делать вещи низкого уровня», я имел в виду, что не хочу вставлять в этот проект низкоуровневые вещи. Я думаю, это будет хорошо, если он будет достаточно надежным. – noname

ответ

2

Вы можете поймать исключение OSError, но это может не помочь вашей программе продолжить работу, где она остановилась.

Для этого вам нужно вставить код между Python и malloc. Вы можете сделать это с помощью LD_PRELOAD в соответствии подробности здесь: How can I limit memory acquired with `malloc()` without also limiting stack?

Идея заключается в том вы реализуете оболочку для malloc, которая вызывает реальную malloc и ждет, чтобы повторить попытку, если это не удается. Если вы предпочитаете не использовать LD_PRELOAD, то создание Python с вашим промежуточным кодом, запеченным в, является возможностью (но немного больше работы).

Библиотека, которую вы напишете для LD_PRELOAD, в конечном итоге будет использоваться практически любой программой, написанной на C или C++. Вы даже можете открыть его с открытым исходным кодом. :)

+3

Примечание: вам не нужно обертывать 'malloc' на современный Python; в 3.4 и выше [PEP 445] (https://www.python.org/dev/peps/pep-0445/) предоставляет API-интерфейсы для замены распределяющих по умолчанию распределителей, используемых Python для любых целей. Нет никакой реальной гарантии того, что Python в конечном счете переходит к 'malloc' вообще (малый объект-распределитель использует арены, которые могут быть напрямую получены с помощью' mmap', например), поэтому эти крючки и гарантии PEP важны. – ShadowRanger

 Смежные вопросы

  • Нет связанных вопросов^_^