限制RAM:python崩溃而不是MemoryError

时间:2017-09-11 15:04:49

标签: python memory

我有一个python程序,有时会消耗大量的RAM。 我试图通过
来限制使用量 resource.setrlimit(resource.RLIMIT_AS, (2**32, 2**32))
但是,这会导致Python崩溃,而不是引发MemoryError

如何让Python保持活力?即我想要 MemoryError。

当我尝试解决cvxpy中的大型实例时出现问题。 (这也意味着我无法减少代码的内存使用量 - 它不是我的代码。) 但是当我通过

分配大量RAM时

然后我按预期得到MemoryError

有什么区别?

编辑:错误消息为:

  

在抛出' std :: bad_alloc'
的实例后终止调用    what():std :: bad_alloc

编辑:我现在有一个(M)WE。

import cvxpy as cvx
import numpy as np
import random
import resource
resource.setrlimit(resource.RLIMIT_AS, (2**32, 2**32))

# Problem data.
m = 500
n = 500
np.random.seed(1)
random.seed(1)
A = np.random.randn(m, n)
b = np.random.randn(m, 1)

# Construct the problem.
X = cvx.Semidef(m)
objective = cvx.Minimize(cvx.sum_entries(cvx.norm(X)))
constraints = [sum([X[random.randint(0,499),random.randint(0,499)] for _ in range(50)]) >= random.random() for _ in range(5000)]
prob = cvx.Problem(objective, constraints)

print("Optimal value", prob.solve(solver = 'SCS'))

几秒后,它开始占用大量内存(超过1GB,这应该是限制)然后因上述错误而崩溃。

1 个答案:

答案 0 :(得分:1)

Python仅在可以发现错误在实际发生之前就抛出MemoryError。否则,它将崩溃。查看MemoryError的官方描述:

https://docs.python.org/2/library/exceptions.html#exceptions.MemoryError