集合操作最简单的高效并行处理

rhwleo rhwleo     2023-04-12     158

关键词:

集合操作最简单的高效并行处理
并行处理是现代开发中必不可少的部分,凡是资源可以相互独立的,都可以运用并行,这样可以充分利用多核CPU的性能,当然,我们也要注意,一定要无阻塞,写出让线程阻塞的代码是每个开发人员的耻辱
还是通过实际场景来说明吧,有个项目,每天晚上要对所有用户进行等级评定,用户信息存储在数据库的User表上,那么怎么在单进程中能够最高效的处理呢?读出用户信息,一个个的串行执行,自然是最差的方式,
一次读出几十条,设置一个最大并行度,按照这个并行度去并行为每个用户执行评定,等这几十条处理完成,再去读取下一批数据,再接着这样处理,这样的方式,可行,但并不是最优,因为等级计算要花费的时间并不固定,可能这一批中某个用户计算的时间很长,其余用户计算的很快,那么,这一批完成最终需要的时间是那个最长的时间,这样累计下来,还是浪费了不少时间
所以,我现在说的方案才是最高效的方式,设置一个最大并行度,按最大并行度设置任务列表,列表中的每个任务不断从数据源中取数据,能取到,就处理,直到取不到为止,最后,等待任务列表中的任务完成,这样的话,就完全避开了上面那个方案的缺点了,也不会有线程阻塞,能够最高效的处理数据

现在,通过两个类,不多的代码,就可以写出高效的并行处理,话不多说,看代码
ParallelHelper:并行帮助器,ForEach方法,为并行处理方法,传入并行度、数据源、以及要进行的处理动作,
AsyncInteration:异步迭代器,盼星星盼月亮,终于盼到微软出了IAsyncEnumerator,这样我们就能设计出无阻塞数据源了,具体代码自己看吧,我觉得我设计的这个类还是比较精妙的(自吹一把)

对于上面的场景,我们可以新建一个AsyncInteration,传入getDataFun动作,在这动作里面,分批查询用户,然后将该AsyncInteration对象作为数据源传入ForEach方法,就完全实现了高效并行处理了
代码已经上传github,还是在老地方,可以直接运行

https://github.com/rhw1111/SampleCodes

用于跨平台并行端口接口的简单高效的语言

...我想使用并行端口(LPT)来接收和发送数据,我之前在不同操作系统中用各种语言做过,比如windows中的VB,linux中的C。但是现在,我想使用一种跨平台的语言(我猜还有一个用于LPT访问的库) 查看详情

什么是sparkrdd?

...表示了一个可以并行操作的、不可变得、被分区了的元素集合。用户不需要关心底层复杂的抽象处理,直接使用方便的算子处理和计算就可以了。RDD示意图:默认情况下,一个HDFS上的数据分片就是一个partiton,RDD分片数决定了并... 查看详情

对集合进行并行计算方法选择的建议:stream的并行流,completablefuture

对于集合的并行计算,我们是要使用流(stream)还是CompletableFuture?如果进行的是计算密集型的操作,并且没有I/O,那么推荐Stream接口,因为实现简单,同时效率也是最高的(如果所    有的线程都是计算密集型的... 查看详情

springbatch从入门到精通-3-并行处理

...Channel)。此外,通过依赖SpringIntegration丰富的通道适配器集合(如JMS和AMQP 查看详情

spark教程三sparkmapfilterflatmapuniondistinctintersection操作

...)进行,这是一个有容错机制的并可以被并行操作的元素集合,具有只读、分区、容错、高效、无需物化、可以缓存、RDD依赖等特征RDD的创建基础RDD1.并行集合(ParallelizedCollections):接收一个已经存在的Scala集合,然后进行各种... 查看详情

stream的使用(代码片段)

stream的使用概述Stream是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregateoperation)集合专注的是数据,流专注的是算法和计算(Stream不是集合元素、不是数据结构、不保存数... 查看详情

一个简单示例看懂.net并行编程

...示例代码中分别用单线程和多线程分别执行5次耗时1秒的操作。打印出执行过程及耗时。以下为示例代码,.netframework要求4.0以上。usingSystem;usingSystem.Collections.Generic;usingSystem.Collections.Concurrent;usingSystem.Diagnostics;using 查看详情

高效告别996,开启java高效编程之门3-5stream流概念解析

...1    重点概念解析中的定义Stream流的组成Stream流和集合的区别 2    概念解析定义:从支持数据处理操作的源生成的元素序列。 解释:元素序列:和集合一样,流也是一个接口,可以访问特定元素类型的一组有... 查看详情

最高效的 Java 原始集合库 [关闭]

】最高效的Java原始集合库[关闭]【英文标题】:MostefficientJavaprimitivecollectionslibrary[closed]【发布时间】:2011-03-1911:14:40【问题描述】:最好的Java原始集合库是什么?(最节省内存和时间)我发现Trove和FastUtil是最常用的,但没有发... 查看详情

java8stream的详细用法

一、概述Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用StreamAPI对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用StreamA... 查看详情

两种高效的事件处理模式(proactor和reactor)

...bsp;1. 每个请求创建一个线程,使用阻塞式 I/O 操作   这是最简单的线程模型,1个线程处理1个连接的全部生命周期。该模型的优点在于:这个模型足够简单,它可以实现复杂的业务场景,同时,线程个数是... 查看详情

jdk8系列stream

...是AmazonKinesis对大数据实时处理的Stream。Java8中的Stream是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregateoperation),或者大批量数据操作(bulkdataoperation)。StreamAPI借助于同样新... 查看详情

plinq并行操作linq

...相关概念C#并行编程-ParallelC#并行编程-TaskC#并行编程-并发集合C#并行编程-线程同步原语C#并行编程-PLINQ:声明式数据并行 背景通过LINQ可以方便的查询并处理不同的数据源,使用ParallelLINQ(PLINQ)来充分获得并行化所带来的优势。P... 查看详情

resilientdistributeddatasets(rdd)(代码片段)

...D)是Spark的基本数据结构。它是一个不可变的分布式对象集合。RDD中的每个数据集被划分为逻辑分区,其可以在集群的不同节点上计算。RDD可以包含任何类型的Python,Java或Scala对象,包括用户定义的类。 形式上,RDD是只读的... 查看详情

spark知识点_rdd

...(数据结构),是集群中各节点上并行处理的分隔元素的集合(汇总),总会用到collect()方法。  RDD可以从Hadoop文件系统中的文件创建,也可以从执行程序中的Scala集合中创建或转换。spark可以在内存中留存一份RDD,方便在... 查看详情

何时使用parallel.foreach,何时使用plinq

...能够分割开来进行并行处理。(例如,有一个巨大的数据集合,其中的元素需要一个一个进行彼此独立的耗时计算)。.netframework4中提供了Parallel.ForEach和PLINQ来帮助我们进行并行处理,本文探讨这两者的差别及适用的场景。Paralle... 查看详情

何时使用parallel.foreach,何时使用plinq

...能够分割开来进行并行处理。(例如,有一个巨大的数据集合,其中的元素需要一个一个进行彼此独立的耗时计算)。.netframework4中提供了Parallel.ForEach和PLINQ来帮助我们进行并行处理,本文探讨这两者的差别及适用的场景。Paralle... 查看详情

查询三个集合、对它们进行排序和限制的最高效方法?

】查询三个集合、对它们进行排序和限制的最高效方法?【英文标题】:Themostperformantwaytoqueryagainstthreecollections,sortthemandlimit?【发布时间】:2013-04-1512:45:19【问题描述】:我需要查询3个不同的集合。然后我需要对收集结果进行排... 查看详情