2016-09-19 83 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。謝謝。 –