處理海量資料和大檔案是面試中經常被問到的題目之一,在日常開發中也具有廣泛的使用方面因此原因特來研究和總結一下常用的此類問題的描述情形和處理方式,既是為了功利的應付面試也是為了為日後工作遇到該類問題提供思路和解決靈感。本文將參考網上和面試常見的題目給出個人的處理方法。
對於海量資料一般的解決思路是將資料進行分割,將大資料分割成更小量的資料後,再進行處理。對於此問題我們
可以試著利用取餘的方式將檔案分割成幾個小檔案,再在每個小檔案中尋找出現頻率最多的ip,最後將多個小檔案中的ip頻率進行統計和對比。
演算法思想(分而治之+hash)
對於每個ip值我們進行hash(ip)再取餘的操作,將之前的大檔案分割成多個小檔案
對於每個小檔案,我們去統計檔案中每個ip出現過的次數,並將出現次數最多的ip進行記錄。
再將每個小檔案**現次數最多的ip進行排序,求出所需的ip。
思路:1. 依次遍歷檔案,通過hash對映將每個檔案的每條資料對映到新的檔案中(此時生成n個小檔案)
2. 統計每個檔案**現次數最多的k個資料,構建成鍵值對的形式
3. 利用堆排序,對這n個檔案中的資料進行遍歷,在n*k條資料中找到合適的k個資料。
思路:1. 遍歷a檔案中的所有資料,將資料根據hash對映到n個小檔案中。
2. 遍歷b檔案中的所有資料,將資料根據同樣的hash對映到n個小檔案中。
3. 根據相同的hash對映規則,此時相同的資料會被記錄到序列號相同的檔案中
4. 對比個序列號相同的檔案,將相同的資料根據訊息資訊+次數構建成鍵值對
利用外排序進行處理。外排序是經典的排序演算法之一,主要針對大資料不能直接寫入記憶體的情況,通過記憶體與外存的互動實現對大量資料的排序。外排序常常採用歸併排序進行處理,首先採用適當的適當的內部排序對輸入檔案的每個片段進行排序,將排好序的片段寫到外部儲存器中,這樣保證每個片段的內容是有序的。接著在利用歸併演算法歸併第一階段生成的歸併段直到剩下乙個歸併段為止。
思路:將資料按照一定的範圍分段輸入到記憶體中,並針對輸入到記憶體中的數採用合適的排序演算法進行排序,並將排序好的資料依次輸入到外存中
對歸併段進行歸併排序,將兩個歸併段的資料排好序之後將新的結果作為歸併段寫入外存中。
重複上述步驟,知道所有資料都排好序並寫入外存中。
思路:1. 依次遍歷整數,將他們按照大小分配到不同的桶中,但是在這種情況下可能造成資料分配不均勻,有的桶中資料過多,多到無法全部載入到記憶體中,有的又過小。
2. 針對過大的桶中資料,我們進行在分割,依據還是根據桶中資料的大小,此時構成類似不平衡的多叉樹。
3. 根據多叉樹第一層統計的數量,我們可以知道中位數在哪個節點,如果節點還有孩子,在判斷節點在哪個孩子節點直到查詢到相關的葉子節點。
以上就是一些常見的對於大量資料的處理方式,通過上面的各種方法可以看到其實對於海量資料的處理通常還是將資料轉化成更小的資料,轉化的方法經常是使用hash函式做相關的對映,當我們將資料轉化成能夠被處理的更小量的資料時,我們對資料進行處理,最後再將處理結果進行合併。在面試中我們經常會被問道在給定的記憶體限制下進行處理,此時我們要做的就是將資料進行合理的分割,保證資料在處理時可以被合理的載入到記憶體中,如果資料還是過大,我們可以進行再次的分割即可。
海量資料的處理
最近在網上看到很多關於海量資料的處理方式 看了很多 很暈!其實我想象中的處理方式是 可能在技術上不知道什麼處理,也看了很多資料,說的也是讓你一知半解的方法 這裡我給出的方法並不是我想的那種,但對於處理海量資料的統計,能夠起到一定的效果!1.sql語句的分頁 select top 100 from a...
記憶體對映對於大檔案的使用
平時很少使用大檔案的記憶體對映,碰巧遇到了這樣的要求,所以把過程記錄下來,當給各位乙個引子吧,因為應用不算複雜,可能有考慮不到的地方,歡迎交流。對於一些小檔案,用普通的檔案流就可以很好的解決,可是對於超大檔案,比如2g或者更多,檔案流就不行了,所以要使用api的記憶體對映的相關方法,即使是記憶體對映...
海量資料的處理方案
關鍵字 企業海量資料 儲存難題如何解決 企業海量資料 儲存難題如何解決 web2.0的廣泛應用及社交網路的繁榮使得企業資料面臨空前的海量管理難題。ibm發現,到2020年,每個消費個人的 資訊足跡 將從目前的每年 1tb增長到2020年的超過16tb。這使得企業資訊架構不得不全力適應這一新的變化,然...