2016-09-19 84 views
1

我使用Crossfilter(DC.JS,因此D3)可视化大量数据。我喜欢图书馆的互动性,但我的数据很快变得太大。我认为适合处理这个问题的最好方法是预先汇总我的数据,如果它太大。我很难发现如何(以及如果)Crossfilter可以使用这类数据。关于汇总结果的crossfilter

为了说明,我有数据的形式

[ 
    {"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"}, 
    {"date":"01-01-2016","food": "pear", "gender": "M", "country": "DE"}, 
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "DE"}, 
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "UK"}, 
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK"}, 
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK"}, 
    {"date":"01-02-2016","food": "apple", "gender": "M", "country": "US"}, 
    ... 
] 

我怎么会去通过可视各地日期字段这个旋转的?因此,知道在01-01,我有3个人买苹果,2个来自德国(1男1女),1个来自英国,例如?

我想我可以做到这一点通过计算排序的数据立方体的每一个组合,然后计算它,就像这样:

[ 
    {"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE", "count": 100000}, 
    {"date":"01-01-2016","food": "pear", "gender": "M", "country": "DE", "count": 72651}, 
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "DE", "count": 12345}, 
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "UK", "count": 9287164}, 
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK", "count": 291732743}, 
    {"date":"01-02-2016","food": "apple", "gender": "M", "country": "US", "count": 128176376} 
    ... 
] 

但是这种设置,我没有赢得太多的金额的数据,我不能完全确定Crossfilter如何处理数据。

回答

1

这个问题相当广泛*,但这里就是了。

有几种方法可以在Crossfilter中处理这个问题。我会按照复杂程度或多或少地列出它们:

  1. 通过使用令牌的键和值来缩小您的记录。例如,{"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"}可能会变成{"d":"01-01-2016","f": "a", "g": "M", "c": "DE"},这将为您节省每个记录几个字节。
  2. 按照前面所述预先聚合记录。对于计数,这很容易。如前所述,您可以使用crossfilter.group.reduceSum(function(d) { return d.count; })或类似的数字对预计数聚合记录的数量进行预先汇总,然后使用crossfilter.group.reduceSum(function(d) { return d.count; })或类似数据来累计计数总和。对于其他类型的聚合,它变得更加复杂,可能需要自定义缩减器,但通常情况下是可能的。如果您在特定的聚合问题上遇到问题,请创建一个关于该问题的新问题,并准确解决问题。
  3. 只需从服务器端驱动基于Crossfilter的API。你会失去一些互动性,但这是一个坚实的方法。这里介绍几种解决方案:https://github.com/dc-js/dc.js/wiki/FAQ#how-do-i-replace-crossfilter-with-a-server-side-solution
  4. 使用一种组合方法,您可以在其中执行一些预聚合服务器端,但仍处理客户端的过滤和最终聚合。我知道的Crossfilter的唯一例子是:http://lcadata.info(源代码在这里:https://github.com/esjewett/lcadata)。这是一个真正依赖数据的解决方案,这里没有通用库。

正交于所有这一切正在将Crossfilter移动到网络工作者,这可以帮助交互性,但并不真正帮助解决数据量问题。

我的建议:做上面的#1,并确定您可以支持多少条记录以及您需要的交互级别。然后,如有必要,执行#2。如果这还不够,请确定#3是否是一个选项,如果是,请这样做。否则,考虑#4,但明白你正在进行一项相当先进的任务,并且将在很大程度上开创自己的足迹。 *为了回答您的具体问题,我们需要更多的信息,比如您试图加载的记录类型数量,您实际需要的维度,您需要的组类型创造等等

+0

感谢您的解释。其实我的问题是一个通用的问题,你的通用答案帮助我解决问题。看来,我一直在以错误的方式使用reduceSum。谢谢。 –