1、首先一點,對於海量數據處理,思路基本上是確定的,必須分塊處理,然后再合並起來。
2、對於每一塊必須找出10個最大的數,因為第一塊中10個最大數中的最小的,可能比第二塊中10最大數中的最大的還要大。
3、分塊處理,再合並。也就是Google MapReduce 的基本思想。Google有很多的服務器,每個服務器又有很多的CPU,因此,100億個數分成100塊,每個服務器處理一塊,1億個數分成100塊,每個CPU處理一塊(此處可以使用堆排序處理TopK)。然后再從下往上合並。注意:分塊的時候,要保證塊與塊之間獨立,沒有依賴關系,否則不能完全並行處理,線程之間要互斥。另外一點,分塊處理過程中,不要有副作用,也就是不要修改原數據,否則下次計算結果就不一樣了。
4、上面講了,對於海量數據,使用多個服務器,多個CPU可以並行,顯著提高效率。對於單個服務器,單個CPU有沒有意義呢?
也有很大的意義。如果不分塊,相當於對100億個數字遍歷,作比較。這中間存在大量的沒有必要的比較。可以舉個例子說明,全校高一有100個班,我想找出全校前10名的同學,很傻的辦法就是,把高一100個班的同學成績都取出來,作比較,這個比較數據量太大了。應該很容易想到,班里的第11名,不可能是全校的前10名。也就是說,不是班里的前10名,就不可能是全校的前10名。因此,只需要把每個班里的前10取出來,作比較就行了,這樣比較的數據量就大大地減少了。