海量資料處理 高階程式設計師之海量資料處理

2021-10-12 08:06:35 字數 1674 閱讀 1178

何謂海量資料處理?

所謂海量資料處理,無非就是基於海量資料上的儲存、處理、操作。何謂海量,就是資料量太大,所以導致要麼是無法在較短時間內迅速解決,要麼是資料太大,導致無法一次性裝入記憶體。

那解決辦法呢?針對時間,我們可以採用巧妙的演算法搭配合適的資料結構,如bloom filter/hash/bit-map/堆/資料庫或倒排索引/trie樹,針對空間,無非就乙個辦法:大而化小,分而治之(hash對映),你不是說規模太大嘛,那簡單啊,就把規模大化為規模小的,各個擊破不就完了嘛。

至於所謂的單機及集群問題,通俗點來講,單機就是處理裝載資料的機器有限(只要考慮cpu,記憶體,硬碟的資料互動),而集群,機器有多輛,適合分布式處理,平行計算(更多考慮節點和節點間的資料互動)。

再者,通過本blog內的有關海量資料處理的文章:big data processing,我們已經大致知道,處理海量資料問題,無非就是:

分而治之/hash對映 + hash統計 + 堆/快速/歸併排序;

雙層桶劃分

bloom filter/bitmap;

trie樹/資料庫/倒排索引;

外排序;

分布式處理之hadoop/mapreduce。

下面,本文第一部分、從set/map談到hashtable/hash_map/hash_set,簡要介紹下set/map/multiset/multimap,及hash_set/hash_map/hash_multiset/hash_multimap之區別(萬丈高樓平地起,基礎最重要),而本文第二部分,則針對上述那6種方法模式結合對應的海量資料處理面試題分別具體闡述。

第一部分、從set/map談到hashtable/hash_map/hash_set

稍後本文第二部分中將多次提到hash_map/hash_set,下面稍稍介紹下這些容器,以作為基礎準備。一般來說,stl容器分兩種,

序列式容器(vector/list/deque/stack/queue/heap),

關聯式容器。關聯式容器又分為set(集合)和map(對映表)兩大類,以及這兩大類的衍生體multiset(多鍵集合)和multimap(多鍵對映表),這些容器均以rb-tree完成。此外,還有第3類關聯式容器,如hashtable(雜湊表),以及以hashtable為底層機制完成的hash_set(雜湊集合)/hash_map(雜湊對映表)/hash_multiset(雜湊多鍵集合)/hash_multimap(雜湊多鍵對映表)。也就是說,set/map/multiset/multimap都內含乙個rb-tree,而hash_set/hash_map/hash_multiset/hash_multimap都內含乙個hashtable。

所謂關聯式容器,類似關聯式資料庫,每筆資料或每個元素都有乙個鍵值(key)和乙個實值(value),即所謂的key-value(鍵-值對)。當元素被插入到關聯式容器中時,容器內部結構(rb-tree/hashtable)便依照其鍵值大小,以某種特定規則將這個元素放置於適當位置。

包括在非關聯式資料庫中,比如,在mongodb內,文件(document)是最基本的資料組織形式,每個文件也是以key-value(鍵-值對)的方式組織起來。乙個文件可以有多個key-value組合,每個value可以是不同的型別,比如string、integer、list等等。

{ "name" : "july

海量資料處理

1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...

海量資料處理

給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...

海量資料處理

分而治之 hash對映 hash統計 堆 快速 歸併排序 300萬個查詢字串中統計最熱門的10個查詢。針對此類典型的top k問題,採取的對策往往是 hashmap 堆。hash統計 先對這批海量資料預處理。具體方法是 維護乙個key為query字串,value為該query出現次數的hashtab...