Подтвердить что ты не робот

Ограниченная память виртуальной памяти Python

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

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

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

import resource
resource.setrlimit(resource.RLIMIT_AS, (megs * 1048576L, -1L))

Ответ 3

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

Вместо этого, если вы хотите играть с исключениями 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 )

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