交叉过滤临时组效率

Crossfilter temporary groups efficiency

我正在将 Crossfilter 与 Vue 集成,想知道效率。

每当 UI 的状态更新时,我都会使用这样的代码进行计算,以从数据集中获取各种指标:

const originKeys = this.dimensions.origin.group().all().map(value => value.key)

此时我意识到每次 UI 更新时调用创建的组都存储在维度的“注册表”中,但由于我没有存储对该组的引用, 它实际上是“丢失”了。
然后,每当数据集更新时,所有这些“丢失”的组都会进行计算,即使结果从未使用过。

这是我猜的,如有错误请指正

计算根据 UI 而变化,因此存储对组的引用毫无意义。

为了克服这个问题,我创建了一个简单的辅助函数,它创建一个临时组并在计算完成后立即处理它。

  function temporaryGroup(dimension, calculator) {
    const group = dim.group()
    const result = calculator(group, dim)
    group.dispose()
    return result
  }

这样使用:

const originKeys = temporaryGroup(this.dimensions.origin, (group) => {
  return group.all().map(value => value.key)
})

问题是,是否有更好(更有效)的临时计算方法,如上面的方法?

答案是否定的。您陈述的假设是正确的。这效率不高,并且没有更有效的方法将此库用于临时组。

Crossfilter 专为一组固定维度和组之间的快速交互而设计。

它在设计上是有状态的,仅添加和删除每个组中根据过滤器的更改而更改的特定行。

这对于基于范围的过滤器尤其重要,因为如果您以交互方式拖动画笔,则每次鼠标移动时都会添加一小部分域,并删除一小部分域。

还创建了数组索引来跟踪从数据 -> 键 -> bin 的映射。 One array of keys and one integer array of indices for the dimension, and one integer array of bin indices 为小组。这使得更新速度很快,但对于临时组来说可能效率低下。

如果您没有一组一致的图表,原则上自己进行计算会更有效,使用类型化数组,例如d3-array.

另一方面,如果你这样做是为了符合 Vue 的数据模型,你可能会看到 Vue 是否有一个类似于 React 的“上下文”的概念,其中共享状态与父组件相关联。这就是例如react-dc-js 保留交叉过滤器对象。