Ограничить память Python VM - PullRequest
20 голосов
/ 19 ноября 2009

Я пытаюсь найти способ ограничить объем памяти, доступной для виртуальной машины Python, как это делает опция «-Xmx» в виртуальной машине Java. (Идея состоит в том, чтобы иметь возможность играть с исключением MemoryError)

Я не уверен, что эта опция существует, но может быть решение, использующее команду ОС для «изоляции» процесса и его памяти.

Спасибо.

Ответы [ 3 ]

34 голосов
/ 25 марта 2011

В Linux я использую модуль resource :

import resource
resource.setrlimit(resource.RLIMIT_AS, (megs * 1048576L, -1L))
12 голосов
/ 19 ноября 2009

В * nix вы можете поиграть с помощью команды ulimit, в частности, -m (максимальный объем памяти) и -v (виртуальная память).

3 голосов
/ 19 ноября 2009

Не тратьте время на это.

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

Вместо этого

for i in range(1000000000000000000000):
    try:
        y = AnotherClass()
    except MemoryError:
        # the thing we wanted to test

Учтите это.

for i in range(1000000000000000000000):
    try:
        y = makeAnotherClass()
    except MemoryError:
        # the thing we wanted to test

Это требует одного крошечного дополнения к вашему дизайну.

class AnotherClass( object ):
    def __init__( self, *args, **kw ):
    blah blah blah

def makeAnotherClass( *args, **kw ):
    return AnotherClass( *args, **kw )

Дополнительная функция - в долгосрочной перспективе - оказывается хорошим шаблоном дизайна. Это Factory , и вам часто нужно что-то подобное.

Затем вы можете заменить makeAnotherClass на что-то вроде этого.

class Maker( object ):
    def __init__( self, count= 12 ):
        self.count= count
    def __call__( self, *args, **kw ):
        if self.count == 0:
            raise MemoryError
        self.count -= 1
        return AnotherClass( *args, **kw )
 makeAnotherClass= Maker( count=12 )

Эта версия создаст исключение без необходимости ограничивать память каким-либо неясным, неподдерживаемым, сложным или магическим способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...