Я иногда пишу программы Python, которые очень трудно определить, сколько памяти это будет использовать перед выполнением. По сути, я иногда вызываю программу Python, которая пытается выделить значительные суммы RAM, заставляющей ядро в большой степени подкачивать и ухудшать выполнение других рабочих процессов.
Из-за этого я хочу ограничить, сколько памяти может вырастить "куча" Python. Когда предел достигнут, программа может просто отказать. Что лучший способ состоит в том, чтобы сделать это?
Если это имеет значение, много кода написано в Cython, таким образом, это должно принять во внимание память, выделенную там. Я не женат на чистом решении Python (это не должно быть портативно), таким образом, что-либо, что работает над Linux, прекрасно.
Проверьте resource.setrlimit(). Он работает только на Unix-системах, но, похоже, это может быть то, что вы ищете, поскольку вы можете выбрать максимальный размер кучи для вашего процесса и дочерних процессов с помощью параметра resource.RLIMIT_DATA.
EDIT: Добавление примера:
import resource
rsrc = resource.RLIMIT_DATA
soft, hard = resource.getrlimit(rsrc)
print 'Soft limit starts as :', soft
resource.setrlimit(rsrc, (1024, hard)) #limit to one kilobyte
soft, hard = resource.getrlimit(rsrc)
print 'Soft limit changed to :', soft
Я не уверен, какой именно случай вы используете, но возможно, что вам нужно установить ограничение на размер стека с помощью resouce.RLIMIT_STACK. Превышение этого предела пошлет сигнал SIGSEGV вашему процессу, и для его обработки вам придется использовать альтернативный стек сигналов, как описано в setrlimit Linux manpage. Однако я не уверен, что sigaltstack реализован в python, так что это может оказаться сложным, если вы хотите восстановиться после выхода за эту границу.
Посмотрите на ulimit. Он позволяет устанавливать квоты на ресурсы. Возможно, потребуются соответствующие настройки ядра.