Javascript d3js(交叉滤波器/dc)箱线图性能

Javascript d3js(交叉滤波器/dc)箱线图性能,javascript,d3.js,crossfilter,dc.js,Javascript,D3.js,Crossfilter,Dc.js,我尝试结合使用D3、Crossfilter和DC生成交互式箱线图,主要使用以下示例: 我的数据看起来更像这样: id date met1 6368 10/24/2013 0.84 6369 10/24/2013 0.67 6374 10/24/2013 0.96 6375 10/24/2013 0.97 大约有50万个数据点,这对除箱线图之外的所有其他数据点都很有效。代码工作正常,箱线图也正常,但当我在其他地方更改过滤器时,箱线图将永远无

我尝试结合使用D3、Crossfilter和DC生成交互式箱线图,主要使用以下示例:

我的数据看起来更像这样:

id      date        met1
6368    10/24/2013  0.84
6369    10/24/2013  0.67
6374    10/24/2013  0.96
6375    10/24/2013  0.97
大约有50万个数据点,这对除箱线图之外的所有其他数据点都很有效。代码工作正常,箱线图也正常,但当我在其他地方更改过滤器时,箱线图将永远无法更新:

var met1Dim = data.dimension(function(d) {return "metric 01";});
var met1Values = met1Dim.group().reduce(
            function(p, v) {
                p.push(v.met1);
                return p;
            },
            function(p,v) {
                p.splice(p.indexOf(v.met1), 1);
                return p;
            },
            function() {
                return [];
            }
当我将整数作为数据传递时(只需将v.met1替换为parseInt(v.met1*100)),性能得到了极大的提高(但仍然不太理想),但这有点半途而废,我希望在适当的范围内显示数据,而不是将所有内容强制为整数。最显著的减速发生在我删除数据集时,我认为是切片(indexOf())减慢了一切(当使用浮点时)。我能做些什么来加快这次行动吗?我在考虑使用id数据的关联数组是一个键,但我不确定如何将关联数组传递到reduce()函数中


谢谢。

使用map lookup而不是
indexOf
肯定会有帮助,但不幸的是,当我所能告诉你的是,你真正想要的只是在顶层显示
met1
值进行基本分组,因为这正是dc.js所期望的

如果dc.js允许您指定一个访问器函数,该函数允许您定义如何在需要时从绑定对象中提取
met1
值,那就太好了。d3在任何地方都使用这种模式,而且非常方便(同时也避免了这种高性能的杂耍)

除非对dc.js进行这样的更改,否则我认为您关于地图查找的想法可能是最好的选择。您可以使用reduce函数的闭包范围来存储它。由于您的记录具有唯一的ID,因此您可以只使用一个映射,而无需担心冲突:

var indexMap = {};
var met1Values = met1Dim.group().reduce(
    function(p, v) {
        indexMap[v.id] = p.length;  // length before push is index of pushed element
        p.push(v.met1);
        return p;
    },
    function(p,v) {
        p.splice(indexMap[v.id], 1);
        return p;
    },
    function() {
        return [];
    }
);

谢谢你的帮助!您的修改使脚本运行得更快。实际上,我试图将map合并到reduce函数中(比如reducead和reduceRemove函数中的p[v.id]=v.dqc),但无法让它工作。你的方法更直观、更实用。更新:我认为这个解决方案可行,但显然不行(没有注意到有一个大数据集)。boxplot函数按值对p数组进行排序,因此indexMap映射变得不正确。另外,当使用p.slice删除时,由于indexMap映射不会随着每次删除而更新,因此它们也会变得不正确。我将不得不进一步挖掘以寻求解决办法。不管怎样,谢谢。好吧,您将无法在多个缩减中重用相同的indexMap。每次调用group.reduce时,应确保indexMap为空。换句话说,indexMap仅在单个group.reduce调用期间使用。这对您描述的问题有帮助吗?我不知道如果indexMap在每个group.reduce调用中都被清空,它将如何工作。如果它是空的,如果我在一行中进行多次缩减,indexMap将如何填充?事实上,因为您使用的是dc.js,所以您可能在有状态地使用组,所以您是对的,这不会起作用。(我的正常用法是处置组并重新创建它们,因此每次通过reduce时,我都倾向于从新开始)。想想看,dc.js正在为方框图本身进行统计计算,这让我感到奇怪。与其在一大堆数据中输入数据,还不如自己计算统计数据,只输入最小值、最大值、中值等等?我不熟悉dc.js,所以我不知道这是否可行。