python - Dask 存储/读取不适合内存的稀疏矩阵
问题描述
我正在使用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()
with时会引发以下错误X
:Cannot convert a sparse array to dense automatically. To manually densify, use the todense method.
但是我无法将稀疏矩阵转换为内存中的密集矩阵,因为它会导致错误。
关于如何做到这一点的任何想法?
解决方案
您可以查看以下问题: https ://github.com/dask/dask/issues/4523
基本上,sparse
有意防止自动转换为密集矩阵。但是,通过设置环境变量SPARSE_AUTO_DENSIFY=1
,您可以覆盖此行为。尽管如此,这只能解决错误,但不能实现您的主要目标。
您需要做的是将文件拆分为多个 *.npz 稀疏矩阵,sparse
以延迟方式加载这些矩阵(请参阅 dask.delayed)并将它们连接到一个大型稀疏 Dask 数组中。
我将不得不在不久的将来实施这样的事情。恕我直言,这应该由 Dask 更本机地支持......
推荐阅读
- r - 如何使搜索引擎在 bookdown gitbook 中为多字节字符(尤其是日语)工作?
- c++ - 如何将指针从 unique_ptr 传递到另一个对象并管理生命周期?
- android - 保存和恢复片段状态,如 Play Store
- powershell - Powershell - 奇怪的变量值返回
- wpf - 材料设计 xaml 不同的窗口/控件的不同主题/调色板
- javascript - 如果 OHLC 中的开盘价和收盘价相同,我可以在烛台上使用不同的颜色吗?
- android - 在没有 3rd 方库的情况下使用 Kotlin 绘制简单的 XY 图(绘图)
- javascript - 创建后在带有模型的html页面中显示值
- wordpress - 将相同的 url 字符串重定向到不同域的按钮
- c - pthread_join 参数类型错误