[英]How does AsParallel() split it's 'source'?
我试图确定AsParallel()如何分割它的'source',实际上'source'是什么意思......
例如...
public class CSVItem
{
public DateTime Date { get; set; }
public string AccountNumber { get; set; }
}
List<CSVItem> CSVItemList = new List<CSVItem>();
然后将500k不同的CSVItem放入CSVItemList。
然后使用:
CSVItemList = CSVItemList.AsParallel().OrderBy(x => x.AccountNumber).ThenBy(q => q.Date).ToList();
它是否只将'源'(意味着例如250k记录到两个线程中的每一个上)拆分到多个异步线程上并执行OrderBy()。然后在每个线程上的ThenBy()合并结果...
或者它将OrderBy()和ThenBy()分离到不同的线程并运行它们然后合并结果...给出一个奇怪的有序列表?
它逐一产生a)完成OrderBy
合并结果而不是gose for b) ThenBy
。 下面的图像形式Albahari博客显示它是如何工作的,即它一个接一个
问:任务数量多少
答:你可以通过使用WithDegreeOfParallelism
来决定这一点,强制PLINQ同时运行指定数量的任务
//create 5 task
List.AsParallel().WithDegreeOfParallelism(5)
检查一下: 并行编程
我创建了一个小例子来检查,哪一个是真的。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static void Main(string[] args)
{
List<TestItem> items = new List<TestItem>();
List<TestItem> itemsNonParallel = new List<TestItem>();
items.Add(new TestItem() { Age = 1, Size = 12 });
items.Add(new TestItem() { Age = 2, Size = 1 });
items.Add(new TestItem() { Age = 5, Size = 155 });
items.Add(new TestItem() { Age = 23, Size = 42 });
items.Add(new TestItem() { Age = 7, Size = 32 });
items.Add(new TestItem() { Age = 9, Size = 22 });
items.Add(new TestItem() { Age = 34, Size = 11 });
items.Add(new TestItem() { Age = 56, Size = 142 });
items.Add(new TestItem() { Age = 300, Size = 13 });
itemsNonParallel.Add(new TestItem() { Age = 1, Size = 12 });
itemsNonParallel.Add(new TestItem() { Age = 2, Size = 1 });
itemsNonParallel.Add(new TestItem() { Age = 5, Size = 155 });
itemsNonParallel.Add(new TestItem() { Age = 23, Size = 42 });
itemsNonParallel.Add(new TestItem() { Age = 7, Size = 32 });
itemsNonParallel.Add(new TestItem() { Age = 9, Size = 22 });
itemsNonParallel.Add(new TestItem() { Age = 34, Size = 11 });
itemsNonParallel.Add(new TestItem() { Age = 56, Size = 142 });
itemsNonParallel.Add(new TestItem() { Age = 300, Size = 13 });
foreach (var item in items.AsParallel().OrderBy(x => x.Age).ThenBy(x => x.Size))
{
Console.WriteLine($"Age: {item.Age} Size: {item.Size}");
}
Console.WriteLine("---------------------------");
foreach (var item in itemsNonParallel.OrderBy(x => x.Age).ThenBy(x => x.Size))
{
Console.WriteLine($"Age: {item.Age} Size: {item.Size}");
}
Console.ReadLine();
}
}
public class TestItem
{
public int Age { get; set; }
public int Size { get; set; }
}
结果
AsParallel()做我们想要的。 它首先处理OrderBy()并行,合并回列表,然后继续下一个查询,在我们的例子中是ThenBy() 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.