首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何建立与java 8集合并行流处理的负载平衡?

如何建立与java 8集合并行流处理的负载平衡?
EN

Stack Overflow用户
提问于 2015-02-14 07:45:33
回答 2查看 458关注 0票数 0

我收集了很多元素(可以是10万或更多),处理每个元素的时间从1秒到1分不等。备注当元素进程花费1秒时,单个CPU核心被加载的时间少于100% (可能是5%或10%)。

因此,我需要以下负载平衡:

  1. 创建比CPU内核更多的线程,比如cpuCoreNumbers*20
  2. 使用myCollection.parallelStream().forEach()启动集合处理
  3. 当CPU负载小于100%时监视其启动下一个元素处理,当CPU负载为100%时停止添加下一个元素,直到负载小于80% (例如)。

其主要思想是创建和使用更多的线程,然后使用CPU内核进行"lite集合处理“,并在”重型“元素开始处理时减少线程。

是否可以像Java 8并行流处理期间那样设置负载平衡?

EN

回答 2

Stack Overflow用户

发布于 2015-02-14 14:50:04

默认情况下,并行流处理将使用常见叉连接池。这可能有许多线程与可用处理器的数量相匹配。

监视和解释CPU使用情况是一项非常重要的任务。这是复杂的事情,如超线程,省电功能,涡轮增压功能等。

票数 1
EN

Stack Overflow用户

发布于 2015-02-16 09:46:37

看起来你被你用来监控的任何一种工具愚弄了。没有一种“光处理”模式。当一个元素的处理只需要很短的时间周期时,它仍然在这个时间段内消耗了一个CPU的100%。您的监视工具可能会平滑这些值,例如,当您有500毫秒的满载和500毫秒的空载时,它可能会打印50%的1秒周期。但是,如果说元素已经使用了CPU的50%被处理,那将是一个完全错误的解释。

只有一种情况是,项目的处理没有完全消耗CPU,使用更多的线程可以改善核心的使用:当项目实际处理的时间很长时,即线程由于等待另一个线程或I/O操作的结果而被阻塞。您应该知道处理任务何时涉及I/O或其他线程同步(如果是这样的话,我假设您在问题中提到过)。

但是,当您一个接一个正确地处理100000个元素时,处理单个项所花费的时间并不重要,因为在一个项完成后,CPU将通过处理下一个元素来保持忙碌。因此,即使是平滑的监控工具也应该显示100%的CPU负载。如果没有,就会涉及一些阻塞,这可能是管道的后续操作或并行化框架的一般开销。然后,您必须分析I/O操作,以找到正确的策略。如果后续的I/O被证明是瓶颈,那么就无助于生成更多的线程来加速计算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28513601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档