我有一个有时会消耗大量RAM的python程序。
我试图通过限制使用resource.setrlimit(resource.RLIMIT_AS, (2**32, 2**32))
但是,这导致Python崩溃而不是引发MemoryError
。
如何保持Python存活?即我想要MemoryError。
当我尝试在cvxpy中解决大型实例时,就会出现问题。 (这也意味着我无法减少代码的内存使用量,这不是我的代码。)
但是当我通过分配大量的RAM时
numpy(numpy.arange(1000*1000*250, dtype="u8")
,
来自How do I use `setrlimit` to limit memory usage? RLIMIT_AS kills too soon; RLIMIT_DATA, RLIMIT_RSS, RLIMIT_STACK kill not at all),或
外壳(调用yes | tr \\n x | head -c $((1024*1024*1024*10)) | grep n
,
来自https://unix.stackexchange.com/questions/99334/how-to-fill-90-of-the-free-memory)
然后我按预期得到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,这应该是限制),然后由于上述错误而崩溃。
最佳答案
Python仅在可以确定错误在实际发生之前就抛出时,才会抛出MemoryError。否则,它将崩溃。查看MemoryError的官方描述:
https://docs.python.org/2/library/exceptions.html#exceptions.MemoryError