Stream接口可以让你以声明的方式处理数据。同时,用内部迭代取代外部迭代能够让原生Java库控制流元素的处理。

Java7之前并行处理数据集合是一件很麻烦的事情:第一步:明确把包含数据的数据结构分成若干子部分;第二步,为每一个子部分分配一个线程;第三步,你需要恰当的时候对他们进行同步来避免不出现竞争的条件;第四步,等待所有线程完成,然后把这些部分结果合并起来。

在本文中你将看到,如何不花大力气来实现对数据集的并行处理。它允许你声明性地将顺序流变为并行流。流是如何在幕后利用JAVA7引入的分支/合并框架。

对收集源调用parallelStream方法把集合转换为并行流。并行流就是把内容分为多个块,并用不同的线程分别处理每个数据块的流。这样一来,你就可以自动把给定操作的工作负荷分配给多核处理器的所有内核,让他们都忙起来。

package ExeriseAboutSreeam;import java.util.stream.Stream;
/*高斯小时候发明了从1+2+3+...+100的简化公式,其实就是今天我们熟悉的等差数列求和问题* 现在我们用计算机编程来实现给定任何n,求1+2+3+...+n的和*/
public class TheSum {//传统方法实现---外部迭代public static long iterativeSum(long n) {long result = 0;for(long i =1L; i<=result;i++) {result += i;}return result;}//利用流处理来实现----内部迭代public static long sequentialSum(long n) {return Stream.iterate(1L,i -> i+1).limit(n).reduce(0L,Long::sum);}//等一等,能不能提高一下计算的效率,假设您的电脑是多核的,怎么利用这太神机?public static long parallelSum(long n) {//利用并行流return Stream.iterate(1L, i -> i+1).limit(n).parallel().reduce(0L, Long ::sum);}
}

如果,看不懂后面两种实现方法,请自行补习JAVA8关于Lambda表达式和流处理的相关内容。

现在,初步体会到并行流的强大作用,可以将数据集划分成若干块,然后利用多核进行多线程同步计算。这样将分配线程、合并结果等工作都抛给了计算机已有的框架。

效果如何?我们来测试一下,使用并行方式是不是更快?

package ExeriseAboutSreeam;import java.util.function.Function;
import java.util.stream.LongStream;
import java.util.stream.Stream;
/*高斯小时候发明了从1+2+3+...+100的简化公式,其实就是今天我们熟悉的等差数列求和问题* 现在我们用计算机编程来实现给定任何n,求1+2+3+...+n的和*/
public class TheSum {//传统方法实现---外部迭代public static long iterativeSum(long n) {long result = 0;for(long i =1L; i<=result;i++) {result += i;}return result;}//利用流处理来实现----内部迭代public static long sequentialSum(long n) {return Stream.iterate(1L,i -> i+1).limit(n).reduce(0L,Long::sum);}//等一等,能不能提高一下计算的效率,假设您的电脑是多核的,怎么利用这台神机?public static long parallelSum(long n) {//利用并行流return Stream.iterate(1L, i -> i+1).limit(n).parallel().reduce(0L, Long ::sum);}//换一个数据结构public static long parallelRangedSum(long n) {return LongStream.rangeClosed(1,n).parallel().reduce(0L, Long ::sum);}//测试模块---测流量性能public long measureSumPerf(Function<Long, Long> adder, long n) {long fastest = Long.MAX_VALUE;for(int i =0; i<10 ; i++) {long start = System.nanoTime();long sum = adder.apply(n);long duration = (System.nanoTime() - start) /1_000_000;//System.out.println("结果:" + sum);if(duration < fastest) fastest = duration;}return fastest;}//主函数,测试时间;public static void main(String[] args) {TheSum theSum = new TheSum();System.out.println("方法1测试结果:" + theSum.measureSumPerf(TheSum::iterativeSum, 10_000_000) + "msecs");System.out.println("方法2测试结果:" + theSum.measureSumPerf(TheSum::sequentialSum, 10_000_000) + "msecs");System.out.println("方法3测试结果:" + theSum.measureSumPerf(TheSum::parallelSum, 10_000_000) + "msecs");System.out.println("方法4测试结果:" + theSum.measureSumPerf(TheSum::parallelRangedSum, 10_000_000) + "msecs");}}

测试结果:

方法1测试结果:0msecs
方法2测试结果:101msecs
方法3测试结果:104msecs
方法4测试结果:2msecs

结果好像和预想的不一致,利用流和并行并没有比传统的外部迭代方式快。为什么会出现这种情况?其实iterator是不适合做 并行处理的,因为它的每一次迭代都要用前一次的结果,加上装箱和拆箱的损耗,反而更耗时。方法四利用了别的数据结构,代码的时间复杂度明显降了下来。看来要正确使用并行流也不是一件容易的事情,用不好的话,反而弄巧成拙,代码运行起来更慢。

如何正确使用并行流?

待更新.......

数据集并行处理的方法和原理----并行处理数据与性能相关推荐

  1. ajax连接前后端原理,前后端数据交互方法和原理

    前后端数据交互方法和原理 发布时间:2018-10-28 11:25, 浏览次数:742 对于想要搞web的新手而言,会用html+css+javascript实现一个页面没什么太大的困难,但是想要前 ...

  2. ssas报表项目数据集_处理SSAS多维OLAP多维数据集的有效方法

    ssas报表项目数据集 介绍 (Introduction) While building and deploying an SSAS OLAP cube, there are two processi ...

  3. 11300001数据集配置错误_Power BI 中的数据刷新(二)

    接着上篇文章我们接着谈谈Power BI 中的数据刷新(二) 查看数据基础结构依赖项 无论采用哪种存储模式,都必须能够访问基础数据源,否则将无法成功刷新数据. 有三种主要的数据访问方案: 数据集使用驻 ...

  4. 小样本点云深度学习库_基于点云深度学习的点云数据集制作系统及方法与流程...

    本发明涉及测控技术领域,尤其涉及一种基于点云深度学习的点云数据集制作系统及方法. 背景技术: 深度学习网络模型一般都是基于64线单帧激光数据集进行.但64线激光器和单帧的限定,造成了工程应用中点云数据 ...

  5. 持续学习常用6种方法总结:使ML模型适应新数据的同时保持旧数据的性能

    来源:Deep IMBA 本文约4800字,建议阅读9分钟 本文将讨论6种方法,使模型可以在保持旧的性能的同时适应新数据,并避免需要在整个数据集(旧+新)上进行重新训练. 持续学习是指在不忘记从前面的 ...

  6. 三代测序原理与数据文件简介(SMRT+Nanopore)

    三代测序原理与数据文件简介(SMRT+Nanopore) 一生雾梦 2019-12-03 20:48:42  1578  收藏 2 分类专栏: 前沿文献分析 文章标签: 三代测序(SMS) SMRT  ...

  7. layer output 激活函数_一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)...

    在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...

  8. android用于查询数据的方法,android: SQLite查询数据

    掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了.不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作. 我们都知道 SQL 的全称是 Structured ...

  9. Caffe2——cifar10数据集创建lmdb或leveldb类型的数据

    Caffe2--cifar10数据集创建lmdb或leveldb类型的数据 时间:2015-05-05 15:52:31      阅读:5183      评论:0      收藏:1      [ ...

最新文章

  1. linux sysctl重启服务,Linux /etc/sysctl.conf重启没有生效
  2. php文件手机怎么解压,linux 怎么解压文件
  3. 对《构建之法》的一点认识
  4. 使 Framework 2.0 的程序集不用安装 Framework 就可以运行的工具免费发布了
  5. 【Linux】【Services】【SaaS】Docker+kubernetes(11. 构建复杂的高可用网络)
  6. 快应用quickapp快速入门教程 by五个半柠檬
  7. vue 根据组件地址动态加载异步组件
  8. linux中安装samba的方法以及注意事项
  9. Python Imaging Library: ImageOps Module(图像运算模块)
  10. node爬取cnode首页数据
  11. 6183. 字符串的前缀分数和(每日一难phase2--day18)
  12. Debian中Nvidia驱动、Firefox、Flash以及alsa声卡驱动安装详解
  13. 写给大忙人看的操作系统
  14. QQ坦白说使用Fiddler抓包获取json
  15. 计算机休眠下睡眠的不同点是什么,电脑休眠和睡眠的区别是什么
  16. 大学一年级(行走的皮卡丘)
  17. easyx文字输出汇总
  18. 计算机硬件与系统软件
  19. tbb学习笔记(一): tbb容器及Mutex
  20. 阿里内核月报:2017年05月

热门文章

  1. 从零开始使用idea搭建spring boot 项目
  2. 深信服防火墙多出口的方法
  3. 单片机七阶音符_求单片机一些音乐的音符及节拍
  4. android studio 生成APK时报错 libs文件夹拒绝访问
  5. 【2020年领域新星】 吴尚哲 牛津大学
  6. naarray查询 swift_最全的 Swift 4 新特性解析
  7. 怎样用计算机表示分数,怎么把计算器变成分数
  8. java输出颜色代码
  9. 微信小程序录音+音频播放(解决ios无法音频播放问题)
  10. 操作系统学习总结-第三章