我使用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<32
和10<y<32
之间的所有数据值。使用当前格式,我所能做的就是遍历x和y索引数组,寻找匹配的索引。这非常非常慢,从磁盘读取多次(我的实际数据通常具有200000x200000
的大小,可能有10000000
个非稀疏元素。
是否有更好的方法来存储大型(大于RAM)稀疏矩阵并支持基于索引的快速查找?
我使用HDF5,但很高兴被指向其他方向
答案 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然后做一些头疼。
最后,如果它不清楚,我只是从读取文件中的值的角度来看这个。我所提出的所有建议都使得创建和更新文件变得更加困难。
最后,最后,您并不是第一个考虑对稀疏数组进行有效和高效索引的人,而您最喜欢的搜索引擎会为您的研究提供一些有用的资源。