UV統計 海量資料統計的前世今生

2021-10-11 23:50:17 字數 3107 閱讀 1279

在網際網路公司中,每個專案都需要資料統計、分析,便於專案組利用詳細資料研究專案的整體情況,進行下一步的調整。在資料統計中,uv統計是最常見的,也是最普遍的。有的場景要求實時性很高,有點場景要求準確性很高,有的場景比較在意計算過程中的記憶體。不同的場景使用不同的演算法,下面我們從0到1簡單介紹下uv統計領域。

假設我們的場景是商家這邊上架一系列水果,然後需要統計出一共上架幾種水果。具體如下所示:

針對這個問題,我們想到的最簡單的方式就是利用stl中的set處理。

上架乙個水果的時候,也同時在set中插入。最後需要統計的時候,直接計算set中一共有幾個水果即可。具體如下所示:

這種方式準確率是絕對準確的,但是這種方式耗費的記憶體是很大的。

假設每個水果需要 k 位元組,那麼如果有 m 個水果,一共需要 k * m 位元組。那麼我們能不能縮小這裡的記憶體呢?

稍微損失一點準確率換取記憶體?具體見下面hashmap的方式

這種演算法在上架乙個水果的時候,只需要在特定的位置置1即可,而不需要儲存這個位置上究竟是何種水果。然後在統計的時候,只需要統計hashmap裡面有多少個1即可。

具體如下所示:

那麼如果有m個水果,這裡其實只需要 m / 8 位元組,相比set的方式記憶體直接縮小到1/8。當然hash肯定會有衝突的,所以這裡肯定有一定準確率的損失。

但是如果涉及到海量資料的uv統計,這裡的記憶體還是很大的。

能否用上統計學進一步縮小記憶體呢?具體見下面的linear count的方式。

這種演算法在上架乙個水果的時候,完全跟hashmap一致,在相應位置置1。

然後在統計的時候,利用統計學的方式,根據hashmap中零的個數給出乙個估算值。具體如下所示:

假設m為雜湊桶長度,那麼每次上架水果,每個桶被選中的概率為:

1

m\frac

m1​然後在上架n個元素後,某個桶為0的概率為:

( 1−

1m)n

(1-\frac) ^n

(1−m1​

)n所以在上架n個元素後,雜湊桶中零的個數期望為:

z er

onum

=∑i=

1m(1

−1m)

n=m(

1−1m

)n=m

((1+

1−m)

−m)−

nm)≈

me−n

mzeronu

m=i=

1∑m​

(1−m

1​)n

=m(1

−m1​

)n=m

((1+

−m1​

)−m)

−mn​

)≈me

−mn​

所以最終:

n =u

v=−m

ln(z

eron

umm)

n = uv = -m ln(\frac)

n=uv=−

mln(

mzer

onum

​)所以linear count演算法中,只需統計下hashmap中零的個數,然後代入上式即可。

這種演算法在n很小的時候,準確率是很高的,但是n很大的時候,它的準確率急劇下降。

針對海量資料的情況,loglog count的演算法更加魯棒

這種演算法跟上面幾種都不同,上架水果的時候,在相應桶裡面記錄的是二進位制數後面最長的連續零個數。然後統計的時候,利用統計學的方式,根據儲存中最長連續字尾零個數,得出乙個估計值。具體如下所示:

既然這裡利用了分桶來減少誤差,那麼這裡統計的時候就必須合起來,這裡有4種方式:

loglog count利用的是算術平均的方式,所以最終估計值為:

u v=

2∑j=

1muv

jmuv=2^^m}}

uv=2m∑

j=1m

​uvj

​​這種演算法對於基數大的情況下準確率挺高的,但是基數小的情況下準確率很低。

這種演算法跟loglog count 類似,有個區別點就是它在求均值的時候利用了調和平均數,而不是算術平均數。這裡最終估計值為:

u v=

mm(∑

j=1m

2−mj

)−1uv=mm(\sum_^m})^

uv=mm(

j=1∑

m​2−

mj​)

−1然後它還引入了分段誤差修正。

準確率記憶體耗時

set絕對準確

k * m

o(mlog(m))

hashmap

很高m/8

o(m)

linear count

基數小高,基數大低

m/8o(m/8)

loglog count

基數小低,基數大高

hyperloglog count

海量資料統計topK

有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。思路 把這1g的資料一次性全部讀入記憶體是不可能了,可以每次讀一行,然後將該詞存到乙個雜湊表裡去,雜湊表的value是詞出現的次數。現在的問題是,這個雜湊表有多大,能不能裝載1m的...

資料統計頁面

麵包屑導航區 class el icon arrow right 首頁 el breadcrumb item 資料統計 el breadcrumb item 資料包表 el breadcrumb item el breadcrumb 卡片檢視區域 為echarts準備乙個具備大小 寬高 的dom m...

tensorflow資料統計

本篇內容包括,tf.norm 張量的範數 tf.reduce min max 最大最小值 tf.argmax argmin 最大最小值的位置 tf.equal 張量的比較 tf.unique 張量的獨特值 1.tf.norm 二範數 x 2 xk 2 1 2 一範數 x 1 xk 無窮範數 x ma...