【问题标题】:Random lookups in large sparse arrays?大型稀疏数组中的随机查找?
【发布时间】:2016-05-31 22:11:47
【问题描述】:

我使用 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,但很高兴被指向其他方向

【问题讨论】:

    标签: sparse-matrix hdf5 random-access


    【解决方案1】:

    首先,让我们假设,正如您的示例所暗示的那样,但您没有明确说明,您存储元素的顺序是首先按x 排序,然后按y 排序。

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

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

    但是,确实发生的一种想法是在您的数组中定义一个z-order curve,并按该顺序将元素存储在您的 HDF5 文件中。作为补充,您需要定义一个z-index,它将标识数组的每个“平铺”中元素的开始位置。这一切都开始变得有点毛茸茸了,我建议你看看the Wikipedia article on z-order curves 并挠头。

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2019-04-11
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多