大數據計算:如何僅用1.5KB內存為十億對象計數

摘要:AddThis的數據分析副總監Matt Abrams在High Scalability上發表了一篇文章,介紹了他們公司如何應對大數據。Matt Abrams表示,AddThis僅僅用了1.5KB內存的內存就計算了十億個不同的對象,這與他們所使用的計算方法分不開的。

AddThis(前身為Clearspring)的數據分析副總監Matt Abrams在High Scalability上發表了一篇文章,介紹了他們公司如何應對大數據。在這篇文章中,AddThis僅僅用了1.5KB內存的內存就計算了十億個不同的對象,Matt Abrams主要向我們詳解了他們公司在處理過程中使用的方法。

以下為文章全文:

在AddThis,我們喜歡統計數據。對一組中不同元素(也稱為“基數”)的數量進行計數,當其數量很大時,這是一個挑戰。

為了更好地理解確定的大型成套基數的挑戰,讓我們想象一下,在你的日志中有一個16個字符的ID,并且你想計算不同ID的數量。這里有一個例子:

4f67bfc603106cb2

16個字符需要用128位來表示。6萬5千個ID將需要1MB的空間。我們每天收到30多億個事件,每個事件都有一個ID。這些ID需要3840億位或45GB的存儲。而這僅僅是ID字段需要的空間!為了得到我們日常活動中的ID基數,我們可以采取一個簡單的方法。最簡單的想法是使用內存中的哈希集合,其中包含在輸入文件中看到的獨特的ID列表。即使我們假設3條記錄中有1個是唯一的,哈希集合仍需要119GB的RAM,不包括Java需要在內存中存儲對象的開銷。你需要一臺配備幾百GB內存的機器來計算不同的元素,并且這只是計算一天的獨特ID的成本。如果我們想要數周或數月的數據,這個問題只會變得更加困難。我們身邊當然不會有一臺配備幾百GB內存的空閑機器,所以我們需要一個更好的解決方案。

解決這一問題的常見辦法是使用位圖。位圖可以用來快速、準確地獲取一個給定的輸入的基數。位圖的基本思路是使用哈希函數映射數據集到一個位字段,在位字段里輸入的獨特元素映射到該字段中的一個位。這產生零碰撞,并減少需要計算每個獨特元素到1位的空間。雖然位圖大大減少了對空間的要求,但當基數是非常高或你對非常多的不同的組進行計數時,它們仍然有問題。例如,如果我們想要使用位圖計數十億,你將需要十億位,或需要每個約120 MB的計數器。稀疏的位圖可以被壓縮,以獲得更多的空間效率,但也并不總是有幫助的。

幸運的是,基數估計是一個熱門的研究領域。我們已經利用這項研究提供了一個開源實現的基數估計、集員資格檢測和top-k算法。

為了了解算法占用的空間與精確度之間的關系,我們用三種不同的計算方法在所有莎士比亞的作品計數了不同單詞的數量(90萬)。請注意,我們的輸入數據集有額外的數據,所以基數高于這個問題答案的標準參考。我們使用的三種技術是:Java HashSet、Linear Probabilistic Counter以及一個Hyper LogLog Counter。這里是結果:

該表顯示,我們只使用512字節的空間就可以進行計數,并且誤差在3%以內。相比之下,HashMap的計數準確度最高,但需要近10MB的空間,你可以很容易地看到為什么基數估計量是有用的。在實際應用中精度并不是很重要的,這是事實,在大多數網絡規模和網絡計算的情況下,用概率計數器可能會節省巨大的空間,這是真的。

線性概率計數器

線性概率計數器是高效的空間,并且允許實現者指定所需的精度水平。該算法在注重空間效率時是很有用的,但你需要能夠控制你結果里的誤差。該算法運行需要兩步:第一步,在內存中分配一個初始化為都為0的位圖,隨后哈希函數被應用于輸入數據中的每個條目,哈希函數的結果將映射條目到位圖的一個位上,該位設置為1;第二步算法對空位的數量進行計算,并使用這個數字輸入到下面的公式來獲得估計。

n=-m ln Vn

在方程中,m是位圖的大小,n是空位和映射的大小的比率。需要重點注意的是原始位圖的大小,可以遠小于預期的最大基數。小多少取決于你能忍受多少錯誤的結果。因為位圖的大小、m,小于不同元素的總數,將會有碰撞。這些碰撞都可以節省空間,但同時也造成了錯誤的估計。所以通過控制原始映射的大小,我們可以估算碰撞的次數,因此我們將在最終結果中看到誤差量。

Hyper LogLog

顧名思義,Hyper LogLog計數器的特點是,你僅需要使用loglog(Nmax)+一個常數那么多位就可以對Nmax進行計數。如線性計數器的Hyper LogLog計數器使設計人員能夠指定所需的精度公差,在Hyper LogLog的情況下,這是通過定義所需的相對標準偏差和你期望要計數的最大基數。大部分計數通過一個輸入數據流、M,并應用一個哈希函數設置h(M)來工作。這將產生一個S = h(M) of {0,1}^∞字符串的可觀測結果。通過分割成m子字符串的哈希輸入流,并為每個子數據保持m的觀測值擴展了Hyper LogLog。使用額外的觀測值的平均值,產生一個計數器,其精度提高為m的大小增長,只需要一個在輸入集的每個元素上恒定要執行的操作數目。其結果是,這個計數器可以僅使用1.5 kb的空間計算精度為2%的十億個截然不同的項。與執行 HashSet所需的120 兆字節進行比較,這種算法的效率變得很明顯。

合并分布式計數器

我們已經證明了使用上面描述的計數器我們可以估算大集合的基數。但是,如果你的原始輸入數據集不適合于單臺機器,你能做些什么?這正是我們在AddThis所面臨的問題。我們的數據分散在數百臺服務器上,并且每個服務器只包含整個數據集子集的一部分。這就是事實,我們可以合并一組分布式計數器的內容,這是至關重要的。這個想法有點令人費解,但如果你花費一些時間去思考這個概念,就會發現其與基本的基數估計值相比并沒有太大的不同。因為計數器代表映射中的位作為基數,我們可以采取兩個兼容計數器并將其位合并到單一的地圖。這個算法已經處理碰撞,所以我們可以得到一個基數估計所需的精密,即使我們從來沒有把所有的輸入數據到一臺機器。這是非常有用的,節省了我們在網絡中移動數據的大量時間和精力。

總結

希望這篇文章能幫助你更好地理解這個概念和概率計數器的應用。如果估計大集合的基數是一個問題,而你又碰巧使用一個基于JVM的語言,那么你應該使用stream-lib項目——它提供了其他幾個流處理工具以及上文所述的算法的實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#關鍵字的個人理解與注釋

C#關鍵字注釋:abstract:抽象as:類型轉換(返回轉換結果)base:基類bool:布爾類型break:條件中斷語句byte:字節case:條件語句catch:異常捕獲后執行ch…

Linux declare命令、Linux tail 命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Linux declare命令用于聲明 shell 變量。 declare為shell指令,在第一種語法中可用來聲明變量并設置變量的屬性([rix]即為變…

詳解Nagios配置文件的邏輯關系

1.主配置文件/usr/local/nagios/etc/nagios.cfg a.定義了用戶和組 b.定義了某些具體參數 c.定義了配置文件和可以存放配置文件的文件夾 d.通過開頭的#號去注釋選項以達到關閉配置的效果 e.更改配置后,可以通過命令 /usr/local/nagios/bin/nagios –v /usr/local/na…

10 步讓你成為更優秀的程序員

這篇文章要介紹的,是我作為專業程序員這些年來學到的能真正提高我的代碼質量和整體工作效率的10件事情。 1. 永遠不要復制代碼 不惜任何代價避免重復的代碼。如果一個常用的代碼片段出現在了程序中的幾個不同地方,重構它,把它放到一個自己的函…

《流浪地球》 電影全集

《流浪地球》 電影全集 《流浪地球》是由郭帆導演,吳京特別出演,屈楚蕭、李光潔、吳孟達等人主演的科幻片《流浪地球》宣布定檔2019大年初一。同時,影片發布了一款定檔預告片,預告片開頭傳來一段廣播聲音:“太陽急速老…

kotlin之plus、copyOf、reverse、forEach、filter、map、reduce、fold等函數解釋和使用

kotlin之::函數調用、plus(增加元素)、copyOf(復制數組)、reverse(翻轉數組)、forEach(遍歷數組)、filter(過濾數組)、map函數操作及擴展、reduce函數、fold函…

linux 常用命令 雜記

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.cat cat 命令用于連接文件并打印到標準輸出設備上。 使用權限 所有使用者 2.Linux chgrp命令用于變更文件或目錄的所屬群組。 3.Linux…

C程序員要學C++嗎?

最近網友問到這一問題,但我更希望被問的是“C程序員需要學面向對象編程嗎?”,那就讓我先從回答這一問題開始,并做適當的擴展。 就我的成長經歷來看,C程序員必須學習面向對象編程!面向對象編程語言有其天然的…

追女生心理研究(本人母胎單身,就是想做準備,并無其他意思)

聊天話題: 1。興趣愛好:美食,旅游,寵物等 2。現在和曾經的自己,分享自己的經歷 3。我變成我們,未來規劃 4。分析隱私,比如一些小秘密 5。價值觀,對未來的規劃等 聊天話題技巧 …

dlopen 和 dlsym 動態調用函數

Linux/unix 提供了使用 dlopen 和 dlsym 方法動態加載庫和調用函數,這套方法在 macOS 和 iOS 上也支持。dlopen 打開一個庫,獲取句柄。dlsym 在打開的庫中查找符號的值。dlclose 關閉句柄。dlerror 返回一個描述最后一次調用dlopen、dlsym,或…

通過騰訊地圖服務獲取行政區劃信息

接口說明地址: https://lbs.qq.com/webservice_v1/guide-region.html 以下是源代碼及表創建腳本。 源碼及相關文件下載轉載于:https://www.cnblogs.com/challengesoflife/p/10405366.html

情感學習聊天方法

1.非正常聊天法 出人意料的聊天技巧,展示幽默感,讓對方對自己產生興趣 比如對方說:你的朋友圈好多美女啊。回答還好了,沒有了。場面會一度尷尬 但可以這么說:你這樣是在間接夸自己是美女。或者:還好啦&a…

面向對象設計的優點

一旦明白了軟件設計的真諦(參見《軟件設計的真諦》),我們就更能理解面向對象設計的優點。簡單說來,它更便于我們在軟件中構建更真實的虛擬世界。 首先,對象的引入方便了在軟件虛擬世界中模擬現實世界。現實世界是由很…

利用SVD-推薦未嘗過的菜肴2

推薦未嘗過的菜肴-基于SVD的評分估計 實際上數據集要比我們上一篇展示的myMat要稀疏的多。 from numpy import linalg as la from numpy import * def loadExData2():return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0,…

在圖像中截取小圖并保存

實現以橫向步長step_row、縱向步長step_col&#xff0c;在一幅大圖上剪裁寬度為width、高度為height的小圖像&#xff0c;圖像命名形式為“數字(遞增)_大圖名”格式&#xff0c;將小圖保存在argv[6]的文件夾中。 #include <opencv2/opencv.hpp> #include <string> …

Linux 文件與目錄管理、ls、cd、pwd、mkdir、rmdir、cp、 rm

見&#xff1a;http://www.runoob.com/linux/linux-file-content-manage.html我們知道Linux的目錄結構為樹狀結構&#xff0c;最頂級的目錄為根目錄 /。 其他目錄通過掛載可以將它們添加到樹中&#xff0c;通過解除掛載可以移除它們。 在開始本教程前我們需要先知道什么是絕對路…

軟件設計的真諦

假設我們身邊的一切都是用制造材料加以描述的&#xff1a;“空調”不是“空調”&#xff0c;而是“由金屬和塑料做成的物體”&#xff1b;“書”不是“書”&#xff0c;而是“由纖維和墨做成的物體”。溝通時我們也不用“空調”和“書”這樣的詞匯&#xff0c;而是“金屬和塑料…

脫單特質

1.上進心 所有人都想過好日子&#xff0c;物質不行&#xff0c;一定要有上進心&#xff0c;可以做出未來給予 2.外在形象 注重打理外在形象&#xff0c;所有人都是愛美的 3.無法控制自己&#xff0c;同時不去了解女生 控制住自己&#xff0c;才有更多的時間去了解和思考女…

云棲社區云棲號(團隊博客)攻略【2018版】

云棲社區云棲號是什么&#xff1f; 這是一個為技術團隊打造的專區&#xff08;小站&#xff09;&#xff0c;團隊成員的技術文章將在這里匯總&#xff0c;可以幫助團隊沉淀優質技術內容、打造技術品牌和影響力等。 云棲號申請條件 點擊https://yq.aliyun.com/teams頁面右側的【…

1030 完美數列 (25 分)二分

1030 完美數列 &#xff08;25 分&#xff09;給定一個正整數數列&#xff0c;和正整數 p&#xff0c;設這個數列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;則稱這個數列是完美數列。 現在給定參數 p 和一些正整數&#xff0c;請你從中選擇盡可能…