相信在.net平台下,我們都玩過linq,是的,linq讓我們的程式簡潔優美,簡直玩的是愛不釋手,但是傳統的linq隻是串行代碼,在并行的
年代如果linq不支援并行計算那該是多麼遺憾的事情啊。
當然linq有很多種方式,比如linq to sql ,xml,object 等等,如果要将linq做成并行還是很簡單的,這裡我就舉一個比較實際一點的例子,
我們知道為了更快的響應使用者操作,碼農們想盡了各種辦法,絞盡了腦汁,其中有一個辦法就是将資料庫資料預加載到記憶體中,然後通過各種
資料結構的手段來加速curd,是的,比如一個排序地球人隻能做到n(lgn),那麼如果我還想再快一點的話該怎麼辦呢?那麼現在的并行就能發
揮巨大的優勢,尤其是現在的伺服器配置都是在8個硬體線程的情況下,你簡直會狂笑好幾天啊,好,不亂扯了。
1:asparallel(并行化)
下面我們模拟給concurrentdictionary灌入1500w條記錄,看看串行和并行效率上的差異,注意我的老爺機是2個硬體線程。
執行的結果還是比較震撼的,将近7倍,這是因為plinq的查詢引擎會盡量利用cpu的所有硬體線程。
2:常用方法的使用
<1> orderby
有時候我們并不是簡單的select一下就ok了,可能需要将結果進行orderby操作,并行化引擎會把要周遊的資料分區,然後在每個區上進行
orderby操作,最後來一個總的orderby,這裡很像算法中的“歸并排序”。
<2> sum(),average()等等這些聚合函數的效果跟orderby類型一樣,都是實作了類型歸并排序的效果,這裡就不舉例子了。
3:指定并行度,這個我在前面文章也說過,為了不讓并行計算占用全部的硬體線程,或許可能要留一個線程做其他事情。
4: 了解parallelenumerable類
首先這個類是enumerable的并行版本,提供了很多用于查詢實作的一組方法,截個圖,大家看看是不是很熟悉,要記住,他們都是并行的。
下面列舉幾個簡單的例子。
5: plinq實作mapreduce算法
mapreduce是一個非常流行的程式設計模型,用于大規模資料集的并行計算,非常的牛x啊,記得mongodb中就用到了這個玩意。
map: 也就是“映射”操作,可以為每一個資料項建立一個鍵值對,映射完後會形成一個鍵值對的集合。
reduce:“化簡”操作,我們對這些巨大的“鍵值對集合“進行分組,統計等等。
下面我舉個例子,用mapreduce來實作一個對age的分組統計。