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

詳解c# PLINQ中的分區(qū)

 更新時(shí)間:2020年07月06日 09:36:05   作者:Savorboard  
這篇文章主要介紹了c# PLINQ中的分區(qū)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

  最近因?yàn)楸容^忙,好久沒有寫博客了,這篇主要給大家分享一下PLINQ中的分區(qū)。上一篇介紹了并行編程,這邊詳細(xì)介紹一下并行編程中的分區(qū)和自定義分區(qū)。

  先做個(gè)假設(shè),假設(shè)我們有一個(gè)200Mb的文本文件需要讀取,怎么樣才能做到最優(yōu)的速度呢?對(duì),很顯然就是拆分,把文本文件拆分成很多個(gè)小文件,充分利用我們計(jì)算機(jī)中的多核cpu的優(yōu)勢,讓每個(gè)cpu都充分的利用,達(dá)到效率的最大化。然而在PLINQ中也是,我們有一個(gè)數(shù)據(jù)源,如果想進(jìn)行最大的并行化操作,那么就需要把其拆分為可以多個(gè)線程同時(shí)訪問的多個(gè)部分,這就是PLINQ中的分區(qū)。當(dāng)然,微軟已經(jīng)為我們想到了這一點(diǎn),知道他的用戶可能會(huì)有這個(gè)需求,所以就先說一下微軟給我們提供的默認(rèn)的一個(gè)分區(qū)程序吧。

  微軟提供的默認(rèn)的分區(qū)程序又叫做任務(wù)并行庫(TPL),其實(shí)就是當(dāng)你用PLINQ的ForEach的時(shí)候,默認(rèn)在其內(nèi)部就會(huì)給我們進(jìn)行分區(qū)。怎么樣,是不是很方便。不過有時(shí)候,你可能會(huì)需要自己來進(jìn)行拆分,那么就是另外一種跟高級(jí)一點(diǎn)的用法了,就是PLINQ的自定義分區(qū)。自定義分區(qū)有兩種,一種是按照范圍分區(qū),另一種是按照區(qū)塊分區(qū)。其中按照范圍分區(qū)在針對(duì)鏈表集合能夠提供非常好的性能,比如IList等,不過它也有一點(diǎn)缺點(diǎn)那就是如果一個(gè)線程提前完成,它將無法幫助其他線程完成它們的工作。按照區(qū)塊分區(qū)是當(dāng)我們不知道我們所要操作的集合的大小的時(shí)候,可以使用按照區(qū)塊分區(qū),在按區(qū)塊分區(qū)中,并行循環(huán)或查詢中的每個(gè)線程或任務(wù)都使用一個(gè)區(qū)塊中一定數(shù)量的源元素,對(duì)它們進(jìn)行處理,然后返回檢索其他元素。分區(qū)程序可確保分發(fā)所有元素,并且沒有重復(fù)項(xiàng)。區(qū)塊可為任意大小。

  通常,只有當(dāng)委托的執(zhí)行時(shí)間為較短到中等程度,源具有大量的元素,并且每個(gè)分區(qū)的總工作量大致相等時(shí),按范圍分區(qū)的速度才會(huì)較快。因此,按區(qū)塊分區(qū)的速度在大多數(shù)情況下較快。對(duì)于元素?cái)?shù)量很少或委托執(zhí)行時(shí)間較長的源,則按區(qū)塊分區(qū)和按范圍分區(qū)的性能大致相等。

  那么我們?nèi)绾螌?shí)現(xiàn)動(dòng)態(tài)分區(qū)呢?下面有一個(gè)摘自MSDN的示例。

  每次分區(qū)對(duì)枚舉器調(diào)用 MoveNext 時(shí),枚舉器都會(huì)提供包含一個(gè)列表元素的分區(qū)。對(duì)于 PLINQ 和 ForEach,分區(qū)是一個(gè) Task 實(shí)例。由于請(qǐng)求同時(shí)在多個(gè)線程上發(fā)生,因此對(duì)當(dāng)前索引的訪問是同步的。

//
// An orderable dynamic partitioner for lists
//
class OrderableListPartitioner<TSource> : OrderablePartitioner<TSource>
{
  private readonly IList<TSource> m_input;

  public OrderableListPartitioner(IList<TSource> input)
    : base(true, false, true)
  {
    m_input = input;
  }

  // Must override to return true.
  public override bool SupportsDynamicPartitions
  {
    get
    {
      return true;
    }
  }

  public override IList<IEnumerator<KeyValuePair<long, TSource>>>
    GetOrderablePartitions(int partitionCount)
  {
    var dynamicPartitions = GetOrderableDynamicPartitions();
    var partitions =
      new IEnumerator<KeyValuePair<long, TSource>>[partitionCount];

    for (int i = 0; i < partitionCount; i++)
    {
      partitions[i] = dynamicPartitions.GetEnumerator();
    }
    return partitions;
  }

  public override IEnumerable<KeyValuePair<long, TSource>>
    GetOrderableDynamicPartitions()
  {
    return new ListDynamicPartitions(m_input);
  }

  private class ListDynamicPartitions
    : IEnumerable<KeyValuePair<long, TSource>>
  {
    private IList<TSource> m_input;
    private int m_pos = 0;

    internal ListDynamicPartitions(IList<TSource> input)
    {
      m_input = input;
    }

    public IEnumerator<KeyValuePair<long, TSource>> GetEnumerator()
    {
      while (true)
      {
        // Each task gets the next item in the list. The index is
        // incremented in a thread-safe manner to avoid races.
        int elemIndex = Interlocked.Increment(ref m_pos) - 1;

        if (elemIndex >= m_input.Count)
        {
          yield break;
        }

        yield return new KeyValuePair<long, TSource>(
          elemIndex, m_input[elemIndex]);
      }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
      return
        ((IEnumerable<KeyValuePair<long, TSource>>)this)
        .GetEnumerator();
    }
  }
}

class ConsumerClass
{
  static void Main()
  {
    var nums = Enumerable.Range(0, 10000).ToArray();
    OrderableListPartitioner<int> partitioner = new OrderableListPartitioner<int>(nums);

    // Use with Parallel.ForEach
    Parallel.ForEach(partitioner, (i) => Console.WriteLine(i));


    // Use with PLINQ
    var query = from num in partitioner.AsParallel()
          where num % 2 == 0
          select num;

    foreach (var v in query)
      Console.WriteLine(v);
  }
}

  這是按區(qū)塊分區(qū)的示例,其中每個(gè)區(qū)塊都由一個(gè)元素組成。通過一次提供多個(gè)元素,您可以減少鎖爭用,并在理論上實(shí)現(xiàn)更快的性能。但是,有時(shí)較大的區(qū)塊可能需要額外的負(fù)載平衡邏輯才能使所有線程在工作完成之前保持忙碌。

以上就是詳解c# PLINQ中的分區(qū)的詳細(xì)內(nèi)容,更多關(guān)于c# PLINQ中的分區(qū)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • FileShare枚舉的使用小結(jié)(文件讀寫鎖)

    FileShare枚舉的使用小結(jié)(文件讀寫鎖)

    其實(shí)/FileShare就是控制文件流的“訪問權(quán)限”,當(dāng)然,這僅僅是入門的文件操作,自己做了筆記,也希望能給大家?guī)韼椭?/div> 2014-01-01
  • C#實(shí)現(xiàn)win10 uwp 右擊浮出窗在點(diǎn)擊位置

    C#實(shí)現(xiàn)win10 uwp 右擊浮出窗在點(diǎn)擊位置

    本文主要讓MenuFlyout出現(xiàn)在我們右擊位置。我們建一個(gè)ListView,然后綁定后臺(tái),在我們ListView要右擊顯示我們的浮出,要求我們的浮出在我們點(diǎn)擊位置
    2016-10-10
  • C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換實(shí)戰(zhàn)案例

    C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換實(shí)戰(zhàn)案例

    最近由于編程的需要,對(duì)C#的類型轉(zhuǎn)換做了一些研究,下面這篇文章主要給大家介紹了關(guān)于C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • C# 批處理調(diào)用方法

    C# 批處理調(diào)用方法

    當(dāng)批處理和aspx不在同一目錄中時(shí),最好用WorkingDirectory設(shè)置啟動(dòng)的進(jìn)程的初始目錄為批處理所在目錄,否則如上例中批處理新建的目錄就應(yīng)在aspx所在目錄中而不是批處理所在目錄了!
    2008-12-12
  • C#操作注冊(cè)表之Registry類

    C#操作注冊(cè)表之Registry類

    這篇文章介紹了C#操作注冊(cè)表之Registry類,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#判斷密碼強(qiáng)度的方法

    C#判斷密碼強(qiáng)度的方法

    這篇文章主要介紹了C#判斷密碼強(qiáng)度的方法,較為詳細(xì)的分析了C#判斷密碼強(qiáng)度的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#算法之整數(shù)反轉(zhuǎn)

    C#算法之整數(shù)反轉(zhuǎn)

    這篇文章介紹了C#算法之整數(shù)反轉(zhuǎn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • C# 讀寫XML文件實(shí)例代碼

    C# 讀寫XML文件實(shí)例代碼

    在本篇文章里小編給大家整理的是關(guān)于C# 讀寫XML文件最簡單方法,需要的朋友們可以跟著學(xué)習(xí)參考下。
    2020-03-03
  • C#中DataGridView導(dǎo)出Excel的兩種方法

    C#中DataGridView導(dǎo)出Excel的兩種方法

    這篇文章主要介紹了C#中DataGridView導(dǎo)出Excel的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C#中Stopwatch的使用及說明

    C#中Stopwatch的使用及說明

    這篇文章主要介紹了C#中Stopwatch的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

桐城市| 扶余县| 云浮市| 新郑市| 金塔县| 延寿县| 北碚区| 西青区| 泰来县| 天气| 江源县| 鄂尔多斯市| 萍乡市| 林口县| 庆安县| 科技| 务川| 长宁县| 烟台市| 松江区| 阿合奇县| 彰武县| 彭水| 临湘市| 廊坊市| 上思县| 鄂伦春自治旗| 东明县| 本溪市| 华池县| 如皋市| 金川县| 响水县| 浠水县| 文安县| 闽清县| 北川| 扬州市| 县级市| 扎兰屯市| 枣阳市|