asm*_*rer 7 mac disk-space python virtual-memory
如果我运行一个存在内存泄漏的 Python 程序,我通常会期望该程序最终以MemoryError. 但是,发生的情况是所有虚拟内存都被使用,直到我的磁盘空间不足。我在视网膜 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?
蟒蛇级别
根据这篇文章,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)
Run Code Online (Sandbox Code Playgroud)
系统级
对于Linux,它实际上也在 stackexchange 和其他站点的各种“板”上多次回答。我找到的最佳答案是here,其中包含一个示例。
答案是使用ulimit -v < kByte >。例如,将 vm 限制为 10M:
ulimit -v 10240
Run Code Online (Sandbox Code Playgroud)
但是,在OS X 上,有迹象(此处和此处)表明ulimit可能会忽略。这些链接很旧。我不确定在最近的 OS X 版本中情况是否有变化。
有这篇文章供 OS X 使用 launchd conf。它建议在 plist 配置中使用Stack部分
<key>SoftResourceLimits</key>
<dict>
<key>Stack</key>
<integer>10000000000</integer>
</dict>
Run Code Online (Sandbox Code Playgroud)
或者使用/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
Run Code Online (Sandbox Code Playgroud)
PS:根据 Mountain Lion man launchd.conf(5) per user launchd.conf 不支持
$HOME/.launchd.conf Your launchd configuration file (currently unsupported).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2171 次 |
| 最近记录: |