7

Если я запускаю программу Python с утечкой памяти, я обычно ожидаю, что программа в конечном итоге умрет с MemoryError . Но вместо этого происходит то, что вся виртуальная память используется до тех пор, пока на моем диске не закончится свободное место. Я использую Mac OS X 10.8 на сетчатке MacBook Pro. Мой компьютер обычно имеет от 10 до 20 ГБ свободного места. Mac OS X достаточно умна, чтобы не умирать полностью, когда на диске не хватает места (скорее, это дает мне диалоговое окно, позволяющее принудительно выйти из моих программ с графическим интерфейсом).

Есть ли способ заставить Python просто умереть, когда ему не хватает реальной памяти, или некоторого разумного объема виртуальной памяти? Это то, что происходит в Linux, насколько я могу судить. Я предполагаю, что Mac OS X более щедра, чем Linux, с виртуальной памятью (может быть, факт того, что у меня есть SSD; я не знаю, насколько умна OS X с этим материалом). Может быть, есть способ заставить ядро Mac OS X никогда не использовать столько виртуальной памяти, которая оставляет на жестком диске менее 5 ГБ?

1 ответ1

9

Уровень Python

Согласно этому сообщению, resource.setrlimit() может быть то, что вам нужно.

пример

#!/usr/bin/python

import resource
import sys
import signal
import time

import os

soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
print 'Soft limit starts as  :', soft

# Use env MY_PY_SET_LIMIT to control limit value
# If MY_PY_SET_LIMIT is not set, RLIMIT_STACK will not change
MY_PY_SET_LIMIT = os.getenv('MY_PY_SET_LIMIT')

if MY_PY_SET_LIMIT != None :
  resource.setrlimit(resource.RLIMIT_STACK, (int(MY_PY_SET_LIMIT), int(MY_PY_SET_LIMIT)))

soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
print 'Soft limit changed to :', soft

TMP = ""

for i in range(10240):
  TMP += "0123456789"
  print len(TMP)

Системный уровень

Что касается Linux, то на самом деле он уже несколько раз отвечал на различных "досках" stackexchange и других сайтах. Лучший ответ, который я нашел, здесь, который содержит пример.

Ответ - использовать ulimit -v <kByte>. Например, ограничение виртуальной машины до 10M:

ulimit -v 10240

Однако на OS X есть индикация (здесь и здесь), которую ulimit может игнорировать. Эти ссылки очень старые. Я не уверен, что ситуация изменится в более поздних выпусках OS X.

Есть этот пост для OS X, чтобы использовать launchd conf. Рекомендуется использовать секцию Stack в конфиге plist

<key>SoftResourceLimits</key>
<dict>
    <key>Stack</key>
    <integer>10000000000</integer>
</dict>

Или с помощью /etc/launchd.conf

launchd.conf

umask 002
limit stack 67104768 67104768
limit maxproc 3400 4500
limit maxfiles 256 unlimited
setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

PS: в соответствии с Mountain Lion man launchd.conf(5) для каждого пользователя launchd.conf не поддерживается

 $HOME/.launchd.conf  Your launchd configuration file (currently unsupported).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .