【參考】外部排序

外部排序

Eg - 數據結構與算法分析 外部排序 noteton

必要性

  大部分內部排序算法都用到內存可直接尋址的事實。如果輸入數據再磁盤上,那麼所有這些操作都失去了它們的效率,因爲磁帶上的元素只能被順序訪問。
  外排序通常採用的是一種“排序-歸併”的策略。在排序階段,先讀入能放在內存中的數據量,將其排序輸出到一個臨時文件,依次進行,將待排序數據組織爲多個有序的臨時文件。而後在歸併階段將這些個臨時文件組合成一個大的有序文件,也即排序結果。

外規定排序

  外部排序的一個例子是外歸併排序(External Merge Sort),它先讀入一些能夠在內存中放得下的數據量,在內存中排序後輸出爲一個順串(即內部數據有序的臨時文件),處理完所有的數據後在進行歸併。
  比如:要對900MB的數據進行排序,但機器上只有100MB的可用內存時,外歸併排序按如下方法操作:
  1. 讀入100MB的數據至內存中,用某種常規排序(如:快速排序、堆排序、歸併排序等)在內存中完成排序。
  2. 將排序完成的數據寫入磁盤(臨時文件)。
  3. 重複步驟1和步驟2直到所有的數據都存入了不同的100MB的塊(臨時文件)中。本例中,900MB數據,100MB內存,故產生了9個臨時文件。
  4. 讀入每個臨時文件(順串)的前10MB(=100MB/(9塊+1),在進行多路歸併的時候,這裏有9路,然後輸出緩衝算一個,所以要將內存資源分給10個部分)的數據放入內存中的輸入緩衝區(總計90MB),最後的10MB作爲輸出緩衝區。(實踐中,將輸入緩衝適當調小,而適當增大輸出緩衝區能獲得比較好的效果)
  5. 執行九路歸併算法,將結果輸出到輸出緩衝區。一旦輸出緩衝區滿,將緩衝區中的數據寫到目標文件,清空緩衝區。一旦9個輸入緩衝區的一個變空,就從這個緩衝區關聯的文件中讀入下一個10MB數據,除非這個文件已讀完。這是“外歸併排序”能在主存外完成排序的關鍵步驟——因爲“歸併算法(merge algorithm)”對每一個大塊只是順序地做一輪訪問(進行歸併),每個大塊不用完全載入主存。
  1-3步是排序,4-5步是歸併。
  爲了增加每一個有序的臨時文件的長度,可以採用置換選擇排序(Replacement Selection Sorting)。它可以產生大於內存的順串。具體方法是在內存中使用一個最小堆進行排序,設這個最小堆的大小爲M,算法描述如下:
  1. 初始時將輸入文件讀入內存,建立最小堆。
  2. 將堆頂元素輸出至輸出緩衝區。然後讀入下一個記錄。
   2.1 若該元素的關鍵碼值不小於剛輸出的關鍵碼值,將其作爲堆頂元素並調整堆,使之滿足對的性質。
   2.2 若該元素的關鍵碼值大於剛輸出的關鍵碼值,將新元素放入堆底位置,將堆的大小減1。
  3. 重複第2步,直至堆大小變爲0。
  4. 此時一個順串已經產生。將堆中的所有元素建堆,開始生成下一個順串。
  此方法能生成平均長度爲2M的順串(證明???),可以進一步減少訪問外部存儲器的次數,節約時間,提高算法效率。

附加的步驟

  上述例子的外排序主要有兩個步驟:排序和歸併;我們用一次多路歸併就完成了所以臨時文件的歸併,並非按照內排序那樣利用內存而採用二路歸併,一次歸併兩個字串,耗費log2n次歸併。外排序中不適合這種二路排序的原因是每次讀寫都要對硬盤進行讀寫,非常緩慢,要極力減少對磁盤的讀寫次數。
  不過,在上述方法中也存在權衡的問題。當臨時文件(順串)的數量繼續增大時,歸併時每次從順串中讀入的數據減少了。比如說,50GB的數據量,100MB的可用內存,這種情況下用一趟多路歸併就顯得不划算。因爲讀入很多的順串花費的時間佔據了排序時間的大部分。這時,我們可以考慮用多次(比如兩次)歸併來解決問題。(注意多次歸併和多路歸併的區別)
  這時排序算法變爲下述這樣:
  1. 第一步不變:初始時將輸入文件讀入內存,建立最小堆。
  2. 將小的順串合併爲大一些的順串,適當減少順串的數目。
  3. 將剩餘的大一些的順串歸併爲最終結果。
  即先歸併小的順串成較大的順串,然後再歸併大一些的順串至最終結果。和內排序一樣,高效的外排序所耗的時間依然是O(nlogn)。若利用好現在計算機上GB的內存,可使得時間複雜度彙總的對數項增長比較緩慢。

優化性能

  計算機科學家吉姆·格雷的Sort Benchmark網站用不同的硬件、軟件環境測試了實現方法不同的多種外排序算法的效率。效率較高的算法具有以下的特徵:
  1. 並行計算
   · 用多個磁盤驅動器並行處理數據,可以加速順序磁盤讀寫。
   ·在計算機上使用多線程,可在多核心的計算機上得到優化。
   ·使用異步輸入輸出,可以同時排序和歸併,同時讀寫。
   ·使用多計算機用高速網絡連接,分擔計算任務。
  2. 提高硬件速度
   ·增大內存,減小磁盤讀寫次數,減少歸併次數。
   ·使用快速的外存設備,比如15000RPM的硬盤或固態硬盤。
   ·使用性能更加優良的各種設備,比如使用多核心CPU和延遲時間更短的內存。
  3. 提高軟件速度
   ·對於某些特殊數據,在第一階段的排序中使用基數排序。
   ·壓縮輸入輸出和臨時文件。

其他算法

  外歸併排序法並不是唯一的外排序算法,另外還有外分配排序,其原理類似於內排序中的桶排序。在歸併排序和桶排序之間存在數學上的對偶性。此外還有一些不耗費附加磁盤空間的原地排序算法。


參考資料

  主要參照wiki的外排序;

資源鏈接


  看到v_JULY_v大牛的博客,對這類問題有一個更詳細的總結,於是,決心另擬一篇博文作爲拜讀大牛作品的筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章