• 《C#并行编程高级教程》第6章 PLINQ:声明式数据并行 笔记


    PLINQ这个话题好多书都写到过,这本也没有什么特别好的地方。
    几个有用和有趣的点记录一下。
     

    顺序的不确定性

    用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-233
     

    PLINQ中的规约操作

    这里指的就是聚合函数。普通的求和,求平均值类的,反正提供好了,用就好了。
    有趣的是,提供了一个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,传入一个希望的最大并行度

    处理异常

    需要注意延时执行的效果,一定要在使用的时候进行捕捉。





  • 相关阅读:
    LeetCode——376.摆动序列
    kaggle——分销商产品未来销售情况预测
    LeetCode——264. 丑数 II
    LeetCode——71.简化路径
    LeetCode——15. 三数之和
    kaggle——NFL Big Data Bowl 2020 Official Starter Notebook
    LeetCode——199. 二叉树的右视图
    数据结构与算法——哈希函数和哈希表等(2)
    数据结构与算法——哈希函数与哈希表等(1)
    Python——Pandas 时间序列数据处理
  • 原文地址:https://www.cnblogs.com/atskyline/p/3236747.html
Copyright © 2020-2023  润新知