2019独角兽企业重金招聘Python工程师标准>>>

1:AsParallel(并行化)

下面我们模拟给ConcurrentDictionary灌入1500w条记录,看看串行和并行效率上的差异,注意我的老爷机是2个硬件线程。

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections.Concurrent;
using System.Collections.Generic;using System.Linq;class Program
{static void Main(string[] args){var dic = LoadData();Stopwatch watch = new Stopwatch();watch.Start();//串行执行var query1 = (from n in dic.Valueswhere n.Age > 20 && n.Age < 25select 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 < 25select 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>();//预加载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; }}
}

执行的结果还是比较震撼的,将近7倍,这是因为plinq的查询引擎会尽量利用cpu的所有硬件线程

2:常用方法的使用

<1> orderby

有时候我们并不是简单的select一下就ok了,可能需要将结果进行orderby操作,并行化引擎会把要遍历的数据分区,然后在每个区上进行

orderby操作,最后来一个总的orderby,这里很像算法中的“归并排序”。

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections.Concurrent;
using System.Collections.Generic;using System.Linq;class Program
{static void Main(string[] args){var dic = LoadData();var query1 = (from n in dic.Values.AsParallel()where n.Age > 20 && n.Age < 25select n).ToList();Console.WriteLine("默认的时间排序如下:");query1.Take(10).ToList().ForEach((i) =>{Console.WriteLine(i.CreateTime);});var query2 = (from n in dic.Values.AsParallel()where n.Age > 20 && n.Age < 25orderby n.CreateTime descendingselect n).ToList();Console.WriteLine("排序后的时间排序如下:");query2.Take(10).ToList().ForEach((i) =>{Console.WriteLine(i.CreateTime);});Console.Read();}public static ConcurrentDictionary<int, Student> LoadData(){ConcurrentDictionary<int, Student> dic = new ConcurrentDictionary<int, Student>();//预加载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; }}
}

<2> sum(),average()等等这些聚合函数的效果跟orderby类型一样,都是实现了类型归并排序的效果,这里就不举例子了。

3:指定并行度,这个我在前面文章也说过,为了不让并行计算占用全部的硬件线程,或许可能要留一个线程做其他事情。

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

4: 了解ParallelEnumerable类

首先这个类是Enumerable的并行版本,提供了很多用于查询实现的一组方法,截个图,大家看看是不是很熟悉,要记住,他们都是并行的。

下面列举几个简单的例子。

class Program
{static void Main(string[] args){ConcurrentBag<int> bag = new ConcurrentBag<int>();var list = ParallelEnumerable.Range(0, 10000);list.ForAll((i) =>{bag.Add(i);});Console.WriteLine("bag集合中元素个数有:{0}", bag.Count);Console.WriteLine("list集合中元素个数总和为:{0}", list.Sum());Console.WriteLine("list集合中元素最大值为:{0}", list.Max());Console.WriteLine("list集合中元素第一个元素为:{0}", list.FirstOrDefault());Console.Read();}
}

5: plinq实现MapReduce算法

mapReduce是一个非常流行的编程模型,用于大规模数据集的并行计算,非常的牛X啊,记得mongodb中就用到了这个玩意。

map:  也就是“映射”操作,可以为每一个数据项建立一个键值对,映射完后会形成一个键值对的集合。

reduce:“化简”操作,我们对这些巨大的“键值对集合“进行分组,统计等等。

具体大家可以看看百科:http://baike.baidu.com/view/2902.htm

下面我举个例子,用Mapreduce来实现一个对age的分组统计。

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections.Concurrent;using System.Collections.Generic;using System.Linq;class Program
{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);//化简统计var reduce = from IGrouping<int, int> singleMapin map.AsParallel()select new{Age = singleMap.Key,Count = singleMap.Count()};///最后遍历reduce.ForAll(i =>{Console.WriteLine("当前Age={0}的人数有:{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; }}
}

转自:http://www.cnblogs.com/huangxincheng/archive/2012/04/04/2431616.html

转载于:https://my.oschina.net/osenlin/blog/344737

并行开发 —— 第三篇 plinq的使用相关推荐

  1. 8天玩转并行开发——第三天 plinq的使用

    8天玩转并行开发--第三天 plinq的使用 原文 8天玩转并行开发--第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是 ...

  2. Agv、Rgv 车辆控制调度系统开发第三篇

    Agv.Rgv 车辆控制调度系统开发第三篇地图编辑器 Agv.Rgv 车辆控制调度系统开发第三篇地图编辑器 Agv.Rgv 车辆控制调度系统开发第三篇地图编辑器 前言 一.GOJS 二.使用步骤 1. ...

  3. 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...

  4. 项目实训-----unity多人游戏开发----第三篇

    游戏制作之人物移动(一) 综述 主体 内容1:人物移动控制方式 方式1:键盘控制 键盘控制角色的transform移动 特点 键盘控制角色的rigidbody移动 特点: 总结 综述 本次我们主要进行 ...

  5. 并行开发 —— 第六篇 异步编程模型

    在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能有人会问,这样做有什么好处,下面一一道来. 一: ...

  6. MFC开发IM-第三篇、资源视图--显示在另一个编辑器中打开

    VS2013 MFC对话框编程,资源视图--显示在另一个编辑器中打开 原创 2017年03月26日 22:47:24 标签: visual studio 3512 问题如下图:  解决办法:  一般这 ...

  7. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  8. Agv、Rgv 车辆控制调度系统开发第四篇

    Agv.Rgv 车辆控制调度系统开发第四篇 车辆调度模拟器 前言 一.车辆模拟器是什么? 二.如何做模拟器 1.动作仿真模拟器 2.完全仿真模拟器 总结 下期预告 系列文章链接 其他文章 新篇章 前言 ...

  9. 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

最新文章

  1. USBSpirit(USB精灵)更新到1.2.300.105
  2. 学了python能干啥-第9p,Python是什么?学了Python能干什么?
  3. 使用MSBuild实现完整daily build流程 .
  4. 137. Leetcode 77. 组合 (回溯算法-组合问题)
  5. 小余学调度:学习记录(2022.4)
  6. java 查看pdf_Java中实现pdf在线查看和下载
  7. 计算男孩女孩小孩各有几个 java——CSDN博客
  8. Java基础(三)选择和循环结构
  9. 《scikit-learn》SVM(二)数据不均衡
  10. Watchman 的安装
  11. 简单的notepad将\n转化为换行
  12. 选择排序 简单选择排序 直接选择排序的区别
  13. ntp server
  14. java生成zipf分布_统计分布-Zipf分布
  15. cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer Micro
  16. 全面了解风控策略体系
  17. 西门子PLC状态字解释
  18. iOS Xcode中UIButton文字换行
  19. 【网易邮箱】换绑安全手机(①之前的手机号注销了怎么办 ②网易人工客服在哪)
  20. SAXReader简单实例分析

热门文章

  1. Oracle 9i安装后,配置和启动企业管理器的详细过程
  2. 微信小程序+微信公众号开发总结
  3. RHEL5.X 重启网卡出现./network-functions: line 78: .: ifcfg-eth0: file not found
  4. Spring 使用介绍(十二)—— Spring Task
  5. bookStore第二篇【图书模块、前台页面】
  6. JavaScriptDOM
  7. JSON字符串和对象 的转换
  8. 关于pipelineDB调用GetLocalStreamReaders的BUG
  9. poj3617Best Cow Line
  10. 如何在Django1.6结合Python3.4版本中使用MySql