Я запускаю 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)
ничего не делает.
Что я делаю неправильно? Я не нашел реальных примеров использования в Интернете.
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
не определен.
RLIMIT_DATA
, я получаю следующее сообщение об ошибке: Traceback (most recent call last): File "my_script.py", line 417, in <module> sys.exit(main()) File "my_script.py", line 391, in main _, hard = resource.getrlimit(resource.RLIMIT_VMEM) AttributeError: 'module' object has no attribute 'RLIMIT_VMEM'
Из списка, на который вы ссылаетесь, все поля могут быть найдены - кроме этого. Я пытаюсь запустить его с Python 3.x прямо сейчас ..