我有一个python程序,有时会消耗大量的RAM。
我试图通过
来限制使用量
resource.setrlimit(resource.RLIMIT_AS, (2**32, 2**32))
但是,这会导致Python崩溃,而不是引发MemoryError
。
如何让Python保持活力?即我想要 MemoryError。
当我尝试解决cvxpy中的大型实例时出现问题。 (这也意味着我无法减少代码的内存使用量 - 它不是我的代码。) 但是当我通过
分配大量RAM时numpy.arange(1000*1000*250, dtype="u8")
,yes | tr \\n x | head -c $((1024*1024*1024*10)) | grep n
,然后我按预期得到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,这应该是限制)然后因上述错误而崩溃。
答案 0 :(得分:1)
Python仅在可以发现错误在实际发生之前就抛出MemoryError。否则,它将崩溃。查看MemoryError的官方描述:
https://docs.python.org/2/library/exceptions.html#exceptions.MemoryError