大型稀疏数组中的随机查找?

时间:2016-02-19 10:56:03

标签: sparse-matrix hdf5 random-access

我使用HDF5以坐标格式存储大量稀疏数组(基本上,M x 3数组存储每个非零元素的值,x索引和y索引)。

这非常适合以迭代方式处理整个数据集,但我正在努力根据索引值进行随机查找。

例如,给定100x100矩阵,我可能会存储非稀疏元素,如下所示:

[[1,2,3,4,5], // Data values
 [13, 14, 55, 67, 80], // X-indices
 [45, 12, 43, 55, 12]] // Y-indices

我希望获得10<x<3210<y<32之间的所有数据值。使用当前格式,我所能做的就是遍历x和y索引数组,寻找匹配的索引。这非常非常慢,从磁盘读取多次(我的实际数据通常具有200000x200000的大小,可能有10000000个非稀疏元素。

是否有更好的方法来存储大型(大于RAM)稀疏矩阵并支持基于索引的快速查找?

我使用HDF5,但很高兴被指向其他方向

1 个答案:

答案 0 :(得分:1)

首先,让我们假设,正如您的示例提示,但您没有最终确定,您可以按顺序存储元素,然后按x排序,然后按y秒排序。

更快速查找的一种简单方法是存储x-index-index,一个元组向量(跟随您的示例,这可能是[(10,1),(20,null),(30,null),(40,null),(50,3),...])指向x-index向量中运行的位置元素开始。如果这个索引索引适合放在RAM中,你可以在计算开始时只从磁盘读取一次。

当然,这只支持快速定位x索引,然后扫描y。如果您需要支持快速定位您进入空间索引领域,并且HDF5可能不是您可以选择的最佳磁盘存储。

但有一种想法确实会在您的数组中定义z-order curve,并按照该顺序将元素存储在HDF5文件中。为了补充你想要定义一个z-index,它将识别每个区块中元素开始的位置&#39;数组。这一切都开始变得有点毛茸茸,我建议你看看the Wikipedia article on z-order curves然后做一些头疼。

最后,如果它不清楚,我只是从读取文件中的值的角度来看这个。我所提出的所有建议都使得创建和更新文件变得更加困难。

最后,最后,您并不是第一个考虑对稀疏数组进行有效和高效索引的人,而您最喜欢的搜索引擎会为您的研究提供一些有用的资源。