2016-11-17 55 views
0

我有MongoDB中的集合與樣品DOC如下 -計算唯一使用的Redis和MongoDB(HyperLogLog)

{ 
    "_id" : ObjectId("58114e5e43d6420b7db4e15c"), 
    "browser" : "Chrome", 
    "name": "hyades", 
    "country" : "in", 
    "day" : "16-10-21", 
    "ip" : "0.0.0.0", 
    "class" : "A123" 
} 

問題陳述

我應該能夠組上的任何的字段,同時獲取不同數量的IP。

聚集查詢 -

[ 
    {$group: {_id: '$class', ip_arr: {$addToSet: '$ip'}}}, 
    {$project: {class: '$_id.class', ip: {$size: '$ip_arr'}}} 
] 

給出了預期的效果,但速度很慢。同樣,使用另一個$group計算ip的速度很慢。輸出是 -

[{class: "A123",ip: 42},{class: "B123", ip: 56}..] 

我試過

我認爲使用Hyperloglog了這一點。我嘗試使用Redis實現。我試圖流式傳輸整個數據,只是把我分組的東西,然後PFADD它放到redis中相應的hyperloglog結構中。

邏輯看起來像 -

var stream = Model.find({}, {ip: 1, class: 1}).stream(); 
stream.on('data', function (doc) { 
    var hash = "HLL/" + doc.class; 
    client.pfadd(hash, doc.ip); 
}); 

我試圖爲一百萬加數據點運行此。要流式傳輸的數據大小大約爲1GB,Mongo和Node服務器之間的連接速度爲1 Gbps。我曾預計這段代碼運行得足夠快。但是,它非常慢(比在MongoDB中計數慢)。

我認爲但沒有實現的另一件事是爲每個類預先創建桶,並在數據流入時實時增加它們。但是支持任意分組所需的內存是巨大的,因此不得不放棄理念。

請建議我可能是做錯了,或者有什麼讓我能夠充分利用hyperloglog的(我不是在Redis的限制,並開放給任何實現)

+0

這個系列的索引是什麼? – dyouberg

+0

你的問題必須理解,標題誤導。 – styvane

+0

@dyouberg索引是在一天,名稱,班級,如果它很重要。 – hyades

回答

0

免責聲明我在這裏可以改善:我我只使用了Python的C++ & redis,所以這可能沒有幫助,但...

PFADD支持多個參數;在我使用redis HLL計算唯一條目的系統中,我發現將它們分批並一次發送一個帶有很多(大約100個)項目的PFADD導致顯着的加速 - 大概是由於避免了redis客戶端往返。

+0

是的,這當然是一個優化。但是,我在同一個盒子上使用Redis,因此往返時間不會被浪費。想知道將所有數據流式傳輸到Redis會是一個好主意嗎? – hyades

+0

我也在同一個盒子上使用redis(TCP本地主機,沒有嘗試unix套接字),並且我上面提到的PFADD的加速是在那個設置上。 – codedstructure