Ответ 1
В режиме * nix вы можете играть с помощью команды ulimit
, в частности, -m (максимальный размер памяти) и -v (виртуальная память).
Я пытаюсь найти способ ограничить доступную память для Python VM, как это делает опция -Xmx в Java VM. (Идея состоит в том, чтобы иметь возможность играть с исключением MemoryError)
Я не уверен, что этот параметр существует, но может быть решение, использующее команду ОС для "изоляции" процесса и его памяти.
Спасибо.
В режиме * nix вы можете играть с помощью команды ulimit
, в частности, -m (максимальный размер памяти) и -v (виртуальная память).
В Linux я использую модуль resource:
import resource
resource.setrlimit(resource.RLIMIT_AS, (megs * 1048576L, -1L))
Не тратьте время на это.
Вместо этого, если вы хотите играть с исключениями 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 )
Эта версия вызовет исключение, если вы не должны ограничить память каким-либо неясным, неподдерживаемым, сложным или магическим способом.