Как ограничить размер "кучи"?

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

Из-за этого я хочу ограничить, сколько памяти может вырастить "куча" Python. Когда предел достигнут, программа может просто отказать. Что лучший способ состоит в том, чтобы сделать это?

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

47
задан martineau 18 September 2016 в 15:40
поделиться

2 ответа

Проверьте 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, так что это может оказаться сложным, если вы хотите восстановиться после выхода за эту границу.

48
ответ дан 26 November 2019 в 19:53
поделиться

Посмотрите на ulimit. Он позволяет устанавливать квоты на ресурсы. Возможно, потребуются соответствующие настройки ядра.

0
ответ дан 26 November 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: