如果我运行一个有内存泄漏的 Python 程序,我通常会认为该程序最终会死机MemoryError
。但事实是,所有的虚拟内存都被使用,直到我的磁盘空间耗尽。我在 Retina MacBook Pro 上运行 Mac OS X 10.8。我的电脑通常有 10GB 到 20GB 的可用空间。Mac OS X 足够智能,不会在磁盘空间耗尽时完全死机(相反,它会给我一个对话框,让我强制退出我的 GUI 程序)。
有没有办法让 Python 在耗尽实际内存或合理数量的虚拟内存时直接死机?据我所知,Linux 上就是这种情况。我猜 Mac OS X 在虚拟内存方面比 Linux 更慷慨(我有一个 SSD 可能是部分原因;我不知道 OS X 在处理这些事情时有多聪明)。也许有办法告诉 Mac OS X 内核永远不要使用太多虚拟内存,导致硬盘上剩余的可用空间不足 5 GB?
答案1
Python 级别
根据这个邮政,资源.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 < 千字节 >。例如,限制vm为10M:
ulimit -v 10240
然而,操作系统有迹象表明(这里&这里) 那限制也许可以忽略。这些链接很旧了。我不确定在较新的 OS X 版本中情况是否会改变。
有这个邮政为 OS X 使用 launchd conf。建议使用堆plist 配置中的部分
<key>SoftResourceLimits</key>
<dict>
<key>Stack</key>
<integer>10000000000</integer>
</dict>
或者/etc/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).