海量資料處理之排序問題

2021-06-18 14:52:00 字數 889 閱讀 6803

海量資料處理中一類常見的問題就是排序問題,即對海量資料中的資料進行排序,例如,乙個檔案中有9億條不重複的9位整數,對這個檔案中數字進行排序。

針對這個問題,最容易想到的方法是將所有資料匯入到記憶體中,然後使用常規的排序方法,例如插入排序、快速排序、歸併排序等各種排序方法對資料進行排序,最後將排序好的資料存入檔案。但這些方法卻不能在此適用,由於資料量巨大,在32位機器中,乙個整數占用4個位元組,而9億條資料以供占用9億* 4byte,大約需要占用3.6g記憶體,對於32位機器而言,很難將這麼多資料一次載入到記憶體,更不談進行排序了,所以此種方法一般不可行,需要考慮其它方法。

方法一,資料庫排序法。將文字檔案匯入到資料庫中,讓資料庫進行索引排序操作後提取資料到檔案。該種方法歲半操作簡單、方便,但是運算速度較慢,而且對資料庫裝置要求比較高。

方法二,分治法。通過hash將9億條資料分為20段,每段大約5000萬條,大約占用500萬*4byte=200m空間,在檔案中依次搜尋0~5000萬,50000001~1億……將排序的結果存入檔案。該方法要裝滿9位整數,一共需要20次,所以一共要進行20次排序,需要對檔案進行20次讀操作。該方法雖然縮小了每次使用的記憶體空間大小,但是編碼複雜,速度也慢。

方案三,位圖法。考慮到最大的9位整數為999999999,由於9億條資料是不重複的,可以把這些資料組成乙個佇列或陣列,讓它有0~999999999(一共10億個數)元素陣列下標表示數值,結點中用0表示沒有這個數,1表示存在這個數,判斷0或1只用乙個bit儲存就夠了,而宣告乙個可以包含9位整數的bit陣列,一共需要10億/8,大約120m記憶體,把記憶體中的資料全部初始化為0 ,讀取檔案中的資料,並將資料放入記憶體。比如讀到乙個資料為341245909這個資料,那就先在記憶體中找到341245909這個bit,並將bit值置為1 ,遍歷整個bit陣列,將bit為1的陣列下標存入檔案,最終得到排序後的內容。

海量資料處理 排序問題

乙個檔案中有9億條不重複的9位整數,對這個檔案中數字進行排序 針對這個問題,最容易想到的方法是將所有資料匯入到記憶體中,然後使用常規的排序方法,例如插入排序,快速排序,歸併排序等各種排序方法對資料進行排序,最後將排序好的資料存入檔案.但這些方法在此並不適用,由於資料量巨大,對32位機器而言,很難將這...

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

何謂海量資料處理?所謂海量資料處理,無非就是基於海量資料上的儲存 處理 操作。何謂海量,就是資料量太大,所以導致要麼是無法在較短時間內迅速解決,要麼是資料太大,導致無法一次性裝入記憶體。那解決辦法呢?針對時間,我們可以採用巧妙的演算法搭配合適的資料結構,如bloom filter hash bit ...

海量資料處理 (top K問題)

前兩天面試3面學長問我的這個問題 想說teg的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了 這個問題還是建立最小堆比較好一些。先拿10000個數建堆,然後一次新增剩餘元素,如果大於堆頂的數 10000中最小的 將這個數替換堆頂,並調整結構使之仍然是乙個最...