让 Python 引发 MemoryError 而不是占用我所有的磁盘空间

让 Python 引发 MemoryError 而不是占用我所有的磁盘空间

如果我运行一个有内存泄漏的 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).

相关内容