大資料排序方案 外排序介紹

2021-07-31 03:23:38 字數 2068 閱讀 2277

原文:

我們一般提到排序都是指內排序,比如快排,堆排序,歸併排序等,所謂內排序就是能把所有待排序的資料外進記憶體之中,比如,乙個陣列之中。但是如果檔案太大,檔案中的所有資料不能一次性的放入記憶體之中,快排,堆排序,歸併排序等內排序就無法工作了。

比如下面的程式生成了乙個包含266萬個int整型的檔案,為了排序這266萬個int整型,我們用外排序。

該演算法分兩個階段:

階段一:把原始資料分成m段,每次讀取一段,存入乙個陣列,使用內排序演算法對這一段資料進行排序,然後將排完序的資料寫入乙個臨時檔案。假定最大陣列規模為10萬個int型值,則每個臨時檔案中儲存著10萬個有序的int型值。我們用s1、s2、.....sk表示這些臨時檔案,其中最後的乙個資料段sk,包含的資料個數可能不足10萬。

階段二:將每對有序資料段(比如s1跟s2、s3跟s4....)合併為乙個大的有序的資料段,將其存入乙個新的臨時檔案。重複此過程,直至只剩下乙個資料段。

實現階段一:

在函式initializesegments中,我們將largedata.dat中每個規模為max_array_size(10萬)的資料段依次放入陣列並排序,使用快排,並將所有排完序的資料依次存入乙個名為f1.dat的新檔案中。函式返回資料段的數目。

階段一**如下:

實現階段二:

每個合併步驟中,兩個有序資料段合併為乙個新的更大的有序資料段,規模加倍,因此,資料段的數目減半。合併後資料無法放入記憶體中。合併步驟的實現方法是:首先將檔案f1.dat中的前一半資料段移動到臨時檔案f2.dat中。然後將檔案f1.dat的第乙個資料段與檔案f2.dat的第乙個資料段合併,寫入臨時檔案f3.dat中。(注 f1.dat中的資料段可能比f2.dat中的多一段,如果這樣的話,在合併操作後,將其最後一段資料段直接複製到f3.dat中)

下面是合併所有資料段的**:

完整的實現**詳見:

(1)int numberofsegments =initializesegments(max_array_size, "largedata.dat", "f1.dat");

從原檔案中建立初始資料段,並將有序資料段存入檔案f1.dat中。

(2)merge(numberofsegments, max_array_size, "f1.dat", "f2.dat", "f3.dat");

將f1中的檔案合併到f3中,利用f2做輔助。函式merge遞迴的呼叫多次,完成多個合併操作。每個步驟將numberofsegments減少一半,而將每個資料段的大小增至一倍。完成乙個合併操作後,下乙個合併步驟中將f3中的新資料段合併至f2中,用f1做輔助。因此新呼叫的合併函式應該為:

merge((numberofsegments + 1) / 2, segmentsize * 2, f3, f1, f2);

遞迴函式merge當numberofsegments變為1時終止,在此情況下,f1包含排好序的資料。將f1複製到sortedlargedata.dat。

外排序分析:

在外排中,主要的代價是檔案io。假定原檔案中待排序的資料個數為n。

在階段一種,從原檔案讀取了n個元素,並寫入臨時檔案,因此階段一的io開銷為o(n)。

在階段二中,在第乙個合併操作之前,有序資料段的數目為n/c,其中c=max_array_size。每個合併操作之後,有序資料段的數目減少一半。因此log(n/c)個步驟之後,資料段的數目為1。每個合併步驟中,從檔案f1讀取一半資料段,寫入臨時檔案f2.f1剩餘資料段與f2資料段進行合併。每個合併步驟的io操作次數為o(n)。所以log(n/c)個合併操作總的io次數為o(n)*log(n/c)。

所以外排序的複雜度為o(nlogn)。

大資料排序

大資料開發工程師的一道經典面試題 如果待排序資料具有某些特點,往往能夠有更加有效的方法解決。同時,這種思想也更加貼近大資料應用的思維方式。對於大資料問題,分而治之的思想十分普遍。同時分布式計算 平行計算等也都類似。包括hadoop採用的map reduce模型,分而治之的思想都貫穿其中。以時間為基準...

對海量資料進行外排序的演算法

需求 一種資料報中包括int,string,long,double 四種型別的陣列,陣列長度均為4096.即4096行,每行有int,string,long,double四個資料 對1000個隨機產生的資料報,按int列進行排序。將int列最小的4096個資料及其對應的其他資料儲存到乙個新的資料報中...

海量資料處理(4) 外排序演算法

外排序演算法是指能夠處理極大量資料的排序演算法。通常來說,外排序處理的資料不能一次裝入記憶體,只能放在硬碟上。通常採用排序 歸併的策略,將原本的大檔案,拆分為若干個小檔案,小檔案可以讀入記憶體中進行排序,然後使用歸併操作。因此,外排序通常分為兩個基本步驟 根據記憶體的大小,盡可能多的分批次的將資料 ...