Как ограничить использование памяти внутри процесса Python

18

Я запускаю 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)

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

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

  • 0
    Есть ли место для повышения эффективности использования программы?
  • 1
    Есть, но это займет некоторое время. На данный момент мне нужно проверить его и убедиться, что он не выключает компьютер. И наличие отказоустойчивой памяти будет полезно позже.
Показать ещё 5 комментариев
Теги:
memory
ulimit

1 ответ

10
Лучший ответ

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 не определен.

  • 1
    Я не использую многопоточность, поэтому я надеюсь, что это не проблема. Но когда я ввожу 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 прямо сейчас ..
  • 0
    Спасибо за разъяснения!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню