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

Ограничить использование памяти?

Я запускаю Python 2.7 на Linux-машине с 16 ГБ оперативной памяти и 64-разрядной ОС. Питон script, который я написал, может загружать слишком много данных в память, что замедляет работу машины до такой степени, что я больше не могу даже убить процесс.

Пока я могу ограничить память, вызывая:

ulimit -v 12000000

в моей оболочке перед запуском script, я хотел бы включить ограничение в самом script. Всюду, где я смотрел, модуль resource цитируется как имеющий ту же мощность, что и ulimit. Но вызов:

import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))

в начале моего script ничего не делает. Даже если значение, равное 12000, никогда не разбивало процесс. Я пробовал то же самое с RLIMIT_STACK, а также с тем же результатом. Любопытно, вызывая:

import subprocess
subprocess.call('ulimit -v 12000', shell=True)

ничего не делает.

Что я делаю неправильно? Я не нашел реальных примеров использования в Интернете.

4b9b3361

Ответ 1

resource.RLIMIT_VMEM - это ресурс соответствующий ulimit -v.

RLIMIT_DATA влияет только на brk/sbrk системные вызовы, тогда как более новые менеджеры памяти обычно используют mmap вместо.

Во-вторых, ulimit/setrlimit влияет только на текущий процесс и его будущих детей.

Относительно сообщения AttributeError: 'module' object has no attribute 'RLIMIT_VMEM': resource docs упоминают эту возможность:

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

В соответствии с bash ulimit source, связанным с выше, он использует RLIMIT_AS, если RLIMIT_VMEM не определен.