考虑以下代码:
def printlen(x): print(len(x))
def argslist(x): return list(x.args)
def add(value_error, arg): raise Exception(*value_error, *arg)
def fibonacci(a, b, x):
try:
assert b<x
printlen(b)
try:
add(a,b)
except Exception as e:
fibonacci(argslist(e), a, x)
except AssertionError as e:
print(e)
threshold = 1000
fibonacci([[]],[[]],[[]]*threshold)
代码使用def、try、except和raise以及两个特殊函数打印从1到阈值的斐波那契数。 如果删除“assert b<;x”行或将阈值设置为非常大的数字,python.exe将接管公羊并冻结一切。 有没有一种机制来限制提升s、尝试s和除s之外的其他内存,或者只是防止分配这么多内存?你知道吗
从技术上讲,这是不可能的。你知道吗
RAM指的是物理内存和python.exe无法访问物理RAM。Windows中的可执行文件只能访问virtual memory (MSDN)。内存中有多少是由Windows决定的。你知道吗
对于32位Python,这应该不是什么大问题,因为它最多只能访问4gb。当然,对于64位,它将开始使用页面文件并写入磁盘,这使得速度变慢。这甚至会影响其他程序。有关详细信息,请参见memory limits (MSDN)
而且,几乎不可能,因为Python不能以独占方式访问CPU。一种称为抢占的机制将确保Windows可以将CPU分配给其他对象。你知道吗
您发布的代码既不使用多线程也不使用多处理,因此它将只使用1个CPU。如果你有一台单核机器,那当然是100%。在我的机器上,它只有25%,其他一切都继续平稳运行:
我不这么认为。你知道吗
是的,在Windows中有一种叫做“Job (MSDN)”的机制可以做到这一点。你得跑了Python.exe在有内存配额的作业中。有一个Superuser question建议使用相应的工具。你知道吗
作为替代方案,您当然可以为fibunci序列实现一个内存限制条件来停止,如下所示:
出于调试的原因,我使用了
if
,因此我可以在断言上放置一个断点来制作下面的屏幕截图。你知道吗如您所见,私有字节(进程使用的内存)约为23.5 GB,工作集(适合计算机物理RAM的内存)也约为23.5 GB。到目前为止没有性能问题。你知道吗
不,没有这样的机制。Python尽可能地分配内存。当它变得不可能时,它会引发
MemoryError
。你知道吗相关问题 更多 >
编程相关推荐