我正在使用sparse来构造,存储和读取大型稀疏矩阵。我想使用Dask数组来使用其阻止的算法功能。
这是我要做的事情的简化版本:
file_path = './{}'.format('myfile.npz')
if os.path.isfile(file_path):
# Load file with sparse matrix
X_sparse = sparse.load_npz(file_path)
else:
# All matrix elements are initially equal to 0
coords, data = [], []
X_sparse = sparse.COO(coords, data, shape=(88506, 1440000))
# Create file for later retrieval
sparse.save_npz(file_path, X_sparse)
# Create Dask array from matrix to allow usage of blocked algorithms
X = da.from_array(X_sparse, chunks='auto').map_blocks(sparse.COO)
return X
不幸的是,上面的代码在尝试将compute()
与X
一起使用时引发以下错误:Cannot convert a sparse array to dense automatically. To manually densify, use the todense method.
;但是我无法将稀疏矩阵转换为内存密集型文件,因为这会导致错误。
关于如何实现此目标的任何想法?
答案 0 :(得分:1)
您可以查看以下问题: https://github.com/dask/dask/issues/4523
基本上,sparse
有意阻止自动转换为密集矩阵。
但是,通过设置环境变量SPARSE_AUTO_DENSIFY=1
,您可以覆盖此行为。但是,这只能解决错误,但不能实现您的主要目标。
您需要做的是将文件分成多个* .npz稀疏矩阵,以sparse
的方式延迟加载(请参阅dask.delayed),并将它们连接成一个大的稀疏Dask数组。
在不久的将来,我将不得不执行类似的事情。恕我直言,这应该由Dask更本地地支持...