并行Linq
有时候我们对大批量数据进行处理,此时并行linq就起作用了.
并行查询
对于以下查询可以耗时会非常大,如下:
const int arraySize = ;
var r = new Random();
var a = Enumerable.Range(, arraySize).Select(x => r.Next());
var c = a.Where(x => Math.Log(x) < ).Select(x => x).Average();
这时候我们可以使用linq中的并行解决方案(使用了AsParallel())
),如果你的CPU支持多核,运行以下代码你会看到效果:
const int arraySize = ;
var r = new Random();
var a = Enumerable.Range(, arraySize).Select(x => r.Next());
var c = a.AsParallel(). Where(x => Math.Log(x) < ).
Select(x => x).Average();
我可以附上截图:以下调整之前的运行结果:
以下为调整之后的结果(加了AsParallel())
经过多次测试, 速度基本上快2到3秒,并且我的电脑是i3(两盒的),如果电脑配置更高,或许速度更快.
虽然速度快了,但从图中可以看出占用的CPU和内存也同样提高了,但是对于现在电脑的配置我觉着内存和CPU可以不用考虑了.
取消
.net 提供了一种标准方式,来取消长时间运行的任务,这也适应于并行Linq
var cts = new CancellationTokenSource(); Task.Factory.StartNew(() =>
{
try
{
var res = (from cc in a.AsParallel().WithCancellation(cts.Token)
where Math.Log(cc) <
select cc).Average();
Console.WriteLine(res);
}
catch (OperationCanceledException ex)
{
Console.WriteLine("");
Console.ReadKey();
}
});
Console.WriteLine("query start");
Console.Write("cancel?");
string input = Console.ReadLine();
if (input.ToLower().Equals("y"))
{
cts.Cancel();
}
因为通过Task.Factory.StartNew是创建的异步执行任务,我们在此操作中创建了一个令牌,如果在查询结果出来之前,我们输入了y,那么语句中的查询就不会执行了,这种情况下
多用于查询任务过长的时候使用.
并行Linq的更多相关文章
- C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)
学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...
- 并行Linq(一)
.Net 并行计算 ----并行Linq(一) 本文是.Net 并行计算 的第三篇 欢迎大家拍砖,阅读本文需要有LINQ基础,因为并行LINQ (PLinq) 其实是LINQ To Object 的并 ...
- C# 多线程八之并行Linq(ParallelEnumerable)
1.简介 关于并行Linq,Ms官方叫做并行语言集成(PLINQ)查询,其实本质就是Linq的多线程版本,常规的Linq是单线程的,也就是同步的过程处理完所有的查询.如果你的Linq查询足够简单,而且 ...
- C#编程(六十三)----------并行LINQ
并行LINQ .NET4在System.Linq命名空间中包含一个新类ParallelEnumerable,可以分解查询的工作使其分布在多个线程上.尽管Enumerable类给IEnumerable& ...
- 四、并行编程 - 并行LINQ(PLINQ) 的使用。AsParallel
用于对内存中的数据做并行运算,也就是说其只支持 LINQ to Object 的并行运算 一.AsParallel(并行化) 就是在集合后加个AsParallel(). 例如: , ); == ); ...
- .NET 实现并行的几种方式(三)
本随笔续接:.NET 实现并行的几种方式(二) 在前两篇随笔中,先后介绍了 Thread .ThreadPool .IAsyncResult (即 APM系列) .Task .TPL (Task Pa ...
- .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)
阅读目录: 1.开篇介绍 2.NET并行计算基本介绍 3.并行循环使用模式 3.1并行For循环 3.2并行ForEach循环 3.3并行LINQ(PLINQ) 1]开篇介绍 最近这几天在捣鼓并行计算 ...
- c# Linq查询
c#提供的ling查询极大的遍历了集合的查询过程,且使用简单方便,非常的有用. 下面将分别用简单的例子说明:ling基本查询.延迟查询属性.类型筛选.复合from字句.多级排序.分组查询.联合查询.合 ...
- 第十讲(LINQ)
一..LINQ查询 例如: static void LINQQuery() { var query = from r in Formula1.GetChampions() where r.Countr ...
随机推荐
- [EffectiveC++]item43:学习处理模板化基类内的名称
- ngRouter和ui-router区别
在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.本文主要对 AngularJS 原生的 ngRoute 路由模块和第三方路由模块 ui.router 的用法进行简单介绍,并做一个对比 ...
- 【转】 iOS播放视频时候,忽略设备静音按钮
用户有时会在静音模式下观看视频,如果不主动设置的话,视频是没有声音的,通过AVAudioSession可开启以视频为主导的播放模式, 首先需要导入,AVFoundtion.framework,在控制播 ...
- weblogic之CVE-2018-3191漏洞分析
weblogic之CVE-2018-3191漏洞分析 理解这个漏洞首先需要看这篇文章:https://www.cnblogs.com/afanti/p/10193169.html 引用廖新喜说的,说白 ...
- Hive学习之路 (八)Hive中文乱码
Hive注释中文乱码 创建表的时候,comment说明字段包含中文,表成功创建成功之后,中文说明显示乱码 create external table movie( userID int comment ...
- linux 字体 设置 en_US.UTF-8
设置:localectl set-local LANG=en_US.UTF-8 查看: localectl list-locales
- Sequelize-nodejs-2-basic usage
Basic usage基本使用 To get the ball rollin' you first have to create an instance of Sequelize. Use it th ...
- python 模拟126邮箱登陆
#coding=utf-8from selenium import webdriverimport time mydriver=webdriver.Firefox()mydriver.get(&quo ...
- c++——对象的动态建立和释放(new 和delete)
3.8 对象的动态建立和释放 1 new和delete基本语法 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来 ...
- HDU1002 A + B Problem II 大数问题
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1002 A + B Problem II Time Limit: 2000/1000 MS (Java ...