天天看點

8天玩轉并行開發——第三天 plinq的使用

   相信在.net平台下,我們都玩過linq,是的,linq讓我們的程式簡潔優美,簡直玩的是愛不釋手,但是傳統的linq隻是串行代碼,在并行的

年代如果linq不支援并行計算那該是多麼遺憾的事情啊。

   當然linq有很多種方式,比如linq to sql ,xml,object 等等,如果要将linq做成并行還是很簡單的,這裡我就舉一個比較實際一點的例子,

我們知道為了更快的響應使用者操作,碼農們想盡了各種辦法,絞盡了腦汁,其中有一個辦法就是将資料庫資料預加載到記憶體中,然後通過各種

資料結構的手段來加速curd,是的,比如一個排序地球人隻能做到n(lgn),那麼如果我還想再快一點的話該怎麼辦呢?那麼現在的并行就能發

揮巨大的優勢,尤其是現在的伺服器配置都是在8個硬體線程的情況下,你簡直會狂笑好幾天啊,好,不亂扯了。

1:asparallel(并行化)

下面我們模拟給concurrentdictionary灌入1500w條記錄,看看串行和并行效率上的差異,注意我的老爺機是2個硬體線程。

8天玩轉并行開發——第三天 plinq的使用

執行的結果還是比較震撼的,将近7倍,這是因為plinq的查詢引擎會盡量利用cpu的所有硬體線程。

2:常用方法的使用

<1> orderby 

      有時候我們并不是簡單的select一下就ok了,可能需要将結果進行orderby操作,并行化引擎會把要周遊的資料分區,然後在每個區上進行

orderby操作,最後來一個總的orderby,這裡很像算法中的“歸并排序”。

8天玩轉并行開發——第三天 plinq的使用
8天玩轉并行開發——第三天 plinq的使用

<2> sum(),average()等等這些聚合函數的效果跟orderby類型一樣,都是實作了類型歸并排序的效果,這裡就不舉例子了。

3:指定并行度,這個我在前面文章也說過,為了不讓并行計算占用全部的硬體線程,或許可能要留一個線程做其他事情。

4: 了解parallelenumerable類

   首先這個類是enumerable的并行版本,提供了很多用于查詢實作的一組方法,截個圖,大家看看是不是很熟悉,要記住,他們都是并行的。

8天玩轉并行開發——第三天 plinq的使用

下面列舉幾個簡單的例子。

8天玩轉并行開發——第三天 plinq的使用

5: plinq實作mapreduce算法

  mapreduce是一個非常流行的程式設計模型,用于大規模資料集的并行計算,非常的牛x啊,記得mongodb中就用到了這個玩意。

map:  也就是“映射”操作,可以為每一個資料項建立一個鍵值對,映射完後會形成一個鍵值對的集合。

reduce:“化簡”操作,我們對這些巨大的“鍵值對集合“進行分組,統計等等。

下面我舉個例子,用mapreduce來實作一個對age的分組統計。

8天玩轉并行開發——第三天 plinq的使用