我想用大的对称密集矩阵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
非常感谢您!
答案 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个任务。