《C#并行编程高级教程》第6章 PLINQ:声明式数据并行 笔记
2013-08-04 20:09
274 查看
PLINQ这个话题好多书都写到过,这本也没有什么特别好的地方。
几个有用和有趣的点记录一下。
var keysWith10Letters = from key in Keys.AsParallel().AsOrdered()
where (CountLetters(key) >= 10)
&& (key.Contains('A'))
&& (key.Contains('F'))
&& (key.Contains('9'))
&& (!key.Contains('B'))
select key;
var keysWith10Letters = from key in Keys.AsParallel()
where (CountLetters(key) >= 10)
&& (key.Contains('A'))
&& (key.Contains('F'))
&& (key.Contains('9'))
&& (!key.Contains('B'))
orderby key
select key;
有趣的是,提供了一个Aggregrate函数,可以自定义聚合函数。
给一段求方差的代码段
int[] inputIntegers = { 0, 3, 4, 8, 15, 22, 34, 57, 68, 32, 21, 30 };
var mean = inputIntegers.AsParallel().Average();
var standardDeviation = inputIntegers.AsParallel().Aggregate(
// Seed
0d,
// Update accumulator function
(subTotal, thisNumber) => subTotal +
Math.Pow((thisNumber - mean), 2),
// Combine accumulators function
(total, thisTask) => total + thisTask,
// Result selector
(finalSum) => Math.Sqrt((finalSum /
(inputIntegers.Count() - 1))));
来自为知笔记(Wiz)
几个有用和有趣的点记录一下。
顺序的不确定性
用PLINQ就一定要记住并行后会导致顺序不确定的问题。解决方案就是AsOrdered或者orderby子句。var keysWith10Letters = from key in Keys.AsParallel().AsOrdered()
where (CountLetters(key) >= 10)
&& (key.Contains('A'))
&& (key.Contains('F'))
&& (key.Contains('9'))
&& (!key.Contains('B'))
select key;
var keysWith10Letters = from key in Keys.AsParallel()
where (CountLetters(key) >= 10)
&& (key.Contains('A'))
&& (key.Contains('F'))
&& (key.Contains('9'))
&& (!key.Contains('B'))
orderby key
select key;
PLINQ中的数据分区
这部分讲的不错,但是需要图片才比较好讲解。在书的P229-233PLINQ中的规约操作
这里指的就是聚合函数。普通的求和,求平均值类的,反正提供好了,用就好了。有趣的是,提供了一个Aggregrate函数,可以自定义聚合函数。
给一段求方差的代码段
int[] inputIntegers = { 0, 3, 4, 8, 15, 22, 34, 57, 68, 32, 21, 30 };
var mean = inputIntegers.AsParallel().Average();
var standardDeviation = inputIntegers.AsParallel().Aggregate(
// Seed
0d,
// Update accumulator function
(subTotal, thisNumber) => subTotal +
Math.Pow((thisNumber - mean), 2),
// Combine accumulators function
(total, thisTask) => total + thisTask,
// Result selector
(finalSum) => Math.Sqrt((finalSum /
(inputIntegers.Count() - 1))));
mean的求值就是内置的聚合函数。
自定义的聚合函数给需要四个参数(另有重载版本,可以不需要这么多参数)
自定义并行的聚合函数的思路是,定义一个初始值,处理每一项,处理每一个分区,得到最终结果。
这也对应了Aggregrate方法的四个参数。
第一个参数 给一个累计的初始值
第二个参数 对每一项进行操作,并累计效果
第三个参数 对每一个分区进行操作,并累计效果
第四个参数 做最后的整理
取消PLINQ
使用WithCancellation,传入一个CancellationToken参数制定并行度
使用WithDegreeOfParallelism,传入一个希望的最大并行度处理异常
需要注意延时执行的效果,一定要在使用的时候进行捕捉。来自为知笔记(Wiz)
相关文章推荐
- C# PLinq:声明式数据并行
- APUE第6章 系统数据文件和信息 笔记
- 数据挖掘笔记-聚类-Canopy-并行处理分析
- C#学习笔记二:并行编程基础:在 PLINQ 和 TPL 中的 Lambda 表达式
- 【hadoop】Hadoop学习笔记(七):使用distcp并行拷贝大数据文件
- 《利用Python进行数据分析》笔记---第6章数据加载、存储与文件格式
- C++并发编程实战chapter1你好,C++的并发世界--笔记1--任务并行和数据并行
- 萌新程序媛笔记-第6章-数据结构基础(1)
- Hadoop学习笔记(七):使用distcp并行拷贝大数据文件
- 并行编程与PLINQ-数据并行
- java 大数据学习笔记(一)并行开发
- 《C#并行编程高级教程》第3章 命令式任务并行 笔记
- 数据结构笔记整理第6章:图
- 分布式机器学习系统笔记(一)——模型并行,数据并行,参数平均,ASGD
- 分布式机器学习系统笔记(一)——模型并行,数据并行,参数平均,ASGD
- 阅读郭林《第一行代码》的笔记——第6章 数据存储全方案,详解持久化技术
- 读书笔记:《C#并行编程高级教程》-第二章:命令式数据并行
- 1.4.3.2 使用 PLINQ 的声明式并行
- C#学习笔记三:数据并行
- 【小笔记】afnetworking取数据时输入接口地址