2010-02-22 2 views
45

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

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

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

+4

Я смущен об этом вопросе. Кажется, он включает в себя ответ, но не указывает, что с ним не так. – amcnabb

+0

Похоже, он скопировал код принятого ответа в свой вопрос. Предположительно, это решение? – fantabolous

+0

@amcnabb Я удалил ответ из вопроса – Djizeus

ответ

45

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

+3

Можете привести пример? Я попробовал установить различные ресурсы rlimits, но я все еще мог выделить список гигабайт. Модуль ресурсов «чувствует себя правильно», но я не могу заставить его работать в Linux. – carl

+0

Я добавил свой тест на вопрос. Я понимаю, что программа Python должна выйти после достижения предела. – carl

+2

Кроме того, меня не волнует, что произойдет, если предел достигнут - программа может сбой, зависание или что-то еще, до тех пор, пока она не будет выделять больше памяти. – carl

0

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

+0

Когда вы используете PAM в любом случае, '/ etc/security/limits.conf' - лучшее место для установки лимитов. 'ulimit' - это только функция оболочки Bash. –

+0

ulimit использует те же системные вызовы, что и ресурсный модуль Python. – Willem

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