我有一个有时会消耗大量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

10-07 21:43