最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#并行編程之PLINQ(并行LINQ)

 更新時間:2022年05月09日 14:37:08   作者:springsnow  
這篇文章介紹了C#并行編程之PLINQ(并行LINQ),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

用于對內(nèi)存中的數(shù)據(jù)做并行運算,也就是說其只支持 LINQ to Object 的并行運算

一、AsParallel(并行化)

就是在集合后加個AsParallel()。

例如:

var numbers = Enumerable.Range(0, 100);
var result = numbers.AsParallel().AsOrdered().Where(i => i % 2 == 0);
foreach (var i in result)
Console.WriteLine(i);

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

static void Main(string[] args)
{
    var dic = LoadData();

    Stopwatch watch = new Stopwatch();

    watch.Start();

    //串行執(zhí)行
    var query1 = (from n in dic.Values
                  where n.Age > 20 && n.Age < 25
                  select n).ToList();

    watch.Stop();

    Console.WriteLine("串行計算耗費時間:{0}", watch.ElapsedMilliseconds);

    watch.Restart();

    var query2 = (from n in dic.Values.AsParallel()
                  where n.Age > 20 && n.Age < 25
                  select n).ToList();

    watch.Stop();

    Console.WriteLine("并行計算耗費時間:{0}", watch.ElapsedMilliseconds);

    Console.Read();
}

public static ConcurrentDictionary<int, Student> LoadData()
{
    ConcurrentDictionary<int, Student> dic = new ConcurrentDictionary<int, Student>();

    //預(yù)加載1500w條記錄
    Parallel.For(0, 15000000, (i) =>
    {
        var single = new Student()
        {
            ID = i,
            Name = "hxc" + i,
            Age = i % 151,
            CreateTime = DateTime.Now.AddSeconds(i)
        };
        dic.TryAdd(i, single);
    });

    return dic;
}

public class Student
{
    public int ID { get; set; }

    public string Name { get; set; }

    public int Age { get; set; }

    public DateTime CreateTime { get; set; }
}

orderby,sum(),average()等等這些聚合函數(shù)都是實現(xiàn)了并行化。

二、指定并行度

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

var query2 = (from n in dic.Values.AsParallel().WithDegreeOfParallelism(Environment.ProcessorCount - 1)
where n.Age > 20 && n.Age < 25
    orderby n.CreateTime descending
    select n).ToList();

三、了解ParallelEnumerable類

首先這個類是Enumerable的并行版本,提供了很多用于查詢實現(xiàn)的一組方法,下圖為ParallelEnumerable類的方法,記住他們都是并行的。

ConcurrentBag<int> bag = new ConcurrentBag<int>();
 var list = ParallelEnumerable.Range
(0, 10000);
 list.ForAll((i) =>
 {
     bag.Add(i);
 });

 Console.WriteLine("bag集合中元素個數(shù)有:{0}", bag.Count);
 Console.WriteLine("list集合中元素個數(shù)總和為:{0}", list.Sum());
 Console.WriteLine("list集合中元素最大值為:{0}", list.Max());
 Console.WriteLine("list集合中元素第一個元素為:{0}", list.FirstOrDefault());

四、plinq實現(xiàn)MapReduce算法

mapReduce是一個非常流行的編程模型,用于大規(guī)模數(shù)據(jù)集的并行計算,非常的牛X啊,記得mongodb中就用到了這個玩意。

  • map:  也就是“映射”操作,可以為每一個數(shù)據(jù)項建立一個鍵值對,映射完后會形成一個鍵值對的集合。
  • reduce:“化簡”操作,我們對這些巨大的“鍵值對集合“進行分組,統(tǒng)計等等。

下面我舉個例子,用Mapreduce來實現(xiàn)一個對age的分組統(tǒng)計。

static void Main(string[] args)
{
    List<Student> list = new List<Student>()
    {
        new Student(){ ID=1, Name="jack", Age=20},
        new Student(){ ID=1, Name="mary", Age=25},
        new Student(){ ID=1, Name="joe", Age=29},
        new Student(){ ID=1, Name="Aaron", Age=25},
    };

    //這里我們會對age建立一組鍵值對
    var map = list.AsParallel().ToLookup(i => i.Age, count => 1);

    //化簡統(tǒng)計
    var reduce = from IGrouping<int, int> singleMap
                 in map.AsParallel()
                 select new
                 {
                     Age = singleMap.Key,
                     Count = singleMap.Count()
                 };

    ///最后遍歷
    reduce.ForAll(i =>
    {
        Console.WriteLine("當(dāng)前Age={0}的人數(shù)有:{1}人", i.Age, i.Count);
    });
}

public class Student
{
    public int ID { get; set; }

    public string Name { get; set; }

    public int Age { get; set; }

    public DateTime CreateTime { get; set; }
}

考慮一個簡單的例子,現(xiàn)有一個容量為1000000的單詞集,需要我們以降序列出其中出現(xiàn)次數(shù)超過100000的單詞(和其次數(shù))。Map過程,使用PLINQ將集合按單詞分組,這里使用了Lookup容器接口,它與Dictionary類似,但是提供的是鍵-值集映射;Reduce過程,使用PLINQ歸約查詢即可。

某一次運行結(jié)果如下:

Word: you, Count: 142416
Word: van, Count: 115816
Word: next, Count: 110228

到此這篇關(guān)于C#并行編程之PLINQ(并行LINQ)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c# 遞歸訪問文件夾(刪掉歌詞文件)

    c# 遞歸訪問文件夾(刪掉歌詞文件)

    今天想把我的音樂里面500首的mp3都拷到手機里,不過這些mp3都有很多層目錄,而且每首歌曲都還有歌詞文件,我只想留下mp3,歌詞文件都刪掉,就寫了個小程序跑一下,比手動刪快多了
    2012-06-06
  • 詳解c# 類型轉(zhuǎn)換

    詳解c# 類型轉(zhuǎn)換

    這篇文章主要介紹了c# 類型轉(zhuǎn)換的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以學(xué)習(xí)
    2020-07-07
  • C#實現(xiàn)批量Word轉(zhuǎn)換Html的示例代碼

    C#實現(xiàn)批量Word轉(zhuǎn)換Html的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#批量Word轉(zhuǎn)換Html的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 如何用C#創(chuàng)建用戶自定義異常淺析

    如何用C#創(chuàng)建用戶自定義異常淺析

    雖然在 C# 語言中已經(jīng)提供了很多異常處理類,但在實際編程中還是會遇到未涉及的一些異常處理,這篇文章主要給大家介紹了關(guān)于如何用C#創(chuàng)建用戶自定義異常的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 在C#中生成PDF的步驟詳解

    在C#中生成PDF的步驟詳解

    在?.NET?世界中,存在許多?PDF?庫,但我們發(fā)現(xiàn),使用集成瀏覽器生成?PDF?更為簡單,由于?DotNetBrowser?可以在完全脫離屏幕的情況下工作,本文給大家介紹了如何在?C#?中生成?PDF,需要的朋友可以參考下
    2024-10-10
  • 深入理解c# checked unchecked 關(guān)鍵字

    深入理解c# checked unchecked 關(guān)鍵字

    本篇文章是對c#中的checked unchecked 關(guān)鍵字進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Unity Shader實現(xiàn)紋理遮罩效果

    Unity Shader實現(xiàn)紋理遮罩效果

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)紋理遮罩效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類

    理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類

    這篇文章主要介紹了理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類,注意類成員的相關(guān)訪問限制和類的繼承問題,需要的朋友可以參考下
    2016-01-01
  • 淺談C#泛型的用處與特點

    淺談C#泛型的用處與特點

    泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。泛型將類型參數(shù)的概念引入 .NET Framework,類型參數(shù)使得設(shè)計如下類和方法成為可能:這些類和方法將一個或多個類型的指定推遲到客戶端代碼聲明并實例化該類或方法的時候
    2013-09-09
  • C#事件(event)使用方法詳解

    C#事件(event)使用方法詳解

    本文給大家介紹了在C#中,事件(event)的概念和使用方法,文章適合一些初學(xué)者學(xué)習(xí),主要講解了一些概念和一些代碼案例。
    2018-01-01

最新評論

荣成市| 手游| 阳谷县| 深泽县| 台南市| 清涧县| 汝城县| 郯城县| 定西市| 无棣县| 扶风县| 锦州市| 江山市| 漯河市| 天峻县| 容城县| 获嘉县| 天祝| 永吉县| 溧阳市| 章丘市| 三门峡市| 玛多县| 静海县| 香河县| 庆云县| 西城区| 靖州| 文成县| 台北市| 陇川县| 阳曲县| 元谋县| 毕节市| 黎川县| 常山县| 博乐市| 岳池县| 突泉县| 凤冈县| 盘山县|