海量數據處理專題

100億個數排序

先將數分爲100份,即分到100個小文件中,然後逐個文件排序,最後採用多路歸併排序,寫入一個大文件中。
1 但是,這種樸素做法每次都要比較100次,才能確定當前最小值,所以,這部分可以優化,即建立一個最小堆,每個值爲pari(num,fd),每次將堆頂元素踢出,從踢出數所屬的文件中再讀入一個元素。
2 前面逐個文件排序的時候,可以並行,排序是耗cpu,讀寫數據耗io.所以可以利用cpu,io進行並行處理。

100億個數求top k。

單核時,直接用堆處理,建立一個k大小的堆,多核時,將其分爲100份,然後多核並行找出當個文件的top k,然後再歸併。

100億個 數/字符串 求頻率最高的top k個

用hash(num)%100將數分到100個文件當中,然後用hashmap求出每個頻率,如果是字符串的話,這步可以用tries來統計頻率。然後用堆找出top k個,然後100個文件的top k進行比較,即可求出最高的top k。

1億整數求重複

數據量在比較小,可以用位圖解決,1億個數,2bit*1億/8的位圖,內存可以承受,即用位圖的話,數據量減少爲1/4。

兩個存儲100億url文件查找重複項

文件a,先用hash(url)%100分爲100,文件b照做,因爲採用相同的hash,所以相同的url會出現在相同的文件中,所以只要比較a1 b1,a2 b2 等等即可,a1 vs b1 的話,可以用較小的那個文件建立hashmap,然後比較大的那個文件從hashmap中找,是否存在該項。

海量數據求中位數

  1. 類似快排方法,隨便從中取出一個數,然後比這個數小的,分到file0中,比這個數大的,分到file1中,如果file0有40個,file1有60個,則說明中位數在file1文件中,繼續從文件file1用這種方法,直到數據可以發到內存,就直接用排序。
  2. 用hash把大文件變小,file文件有100億個,將其分爲10份,劃分的時候,按照大小來劃分,例如char類型,最大爲127,劃分爲10份,每份間隔127/10=12,所以第一份爲0-12,第二份13-25,依次類推統計每個文件中個數,然後就可以看出中位數在10個文件中的哪個,然後在該文件中繼續用這種方法劃分查找,直到找到。
發佈了19 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章