dask.linalg.solve(A,b)上的MemoryError用于解决Ax = b

时间:2019-06-11 14:53:44

标签: python dask

我想用大的对称密集矩阵A (> 100GB)求解方程Ax = b。我正在尝试Dask,因为它应该是python处理大数据的不错的高级API。

这是我的代码:

n = 100000 # makes 75GB array
chunk_size = 5000
A = da.random.random(size=(n, n), chunks=(chunk_size, chunk_size))
b = np.random.random(n)
x = da.linalg.solve(A, b)
res = x.compute()

不幸的是,我收到以下错误,显然是因为A太大。 Dask中是否有任何智能机制可以防止MemoryError(例如,迭代解决问题)?

Traceback (most recent call last):
File "test_solver.py", line 27, in <module>
x = da.linalg.solve(A, b)
File "..\venv\lib\site-packages\dask\array\linalg.py", line 916, in solve
File "..\venv\lib\site-packages\dask\array\linalg.py", line 755, in lu
MemoryError

非常感谢您!

1 个答案:

答案 0 :(得分:2)

您的问题不是数组太大,而是您的块太小:数组由1,000,000个片断组成,并且solve图包含成倍增加的任务。

例如,如果块大小为5000x5000(每块190Mbyte),则会得到

In [5]: n = 100000 # makes 75GB array
   ...: chunk_size = 5000
   ...: A = da.random.random(size=(n, n), chunks=(chunk_size, chunk_size))
   ...: b = np.random.random(n)
   ...: x = da.linalg.solve(A, b)
In [7]: len(x.dask)
6541
图中的

6541个任务。如果块大小为1000x1000,您将获得427401个任务。

https://docs.dask.org/en/latest/best-practices.html