Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在短时间内用Java执行数百万个任务?_Java_Multithreading_Performance - Fatal编程技术网

在短时间内用Java执行数百万个任务?

在短时间内用Java执行数百万个任务?,java,multithreading,performance,Java,Multithreading,Performance,我需要用Java执行大约8000000个任务。每个任务的运行时间在1到50毫秒之间。我曾尝试使用循环串行执行这些任务,并使用ThreadPoolExecutor并行执行这些任务。显然,在循环中串行运行它们要慢得多,然后通过ThreadPoolExecutor运行它们可以显著提高性能。但是,我仍然不满意ThreadPoolExecutor的性能 我能够在4个内核上使用15个线程运行所有8000000个任务。在将任务提交到ThreadPoolExecutor时,我正在批处理50000个任务。我允许E

我需要用Java执行大约8000000个任务。每个任务的运行时间在1到50毫秒之间。我曾尝试使用循环串行执行这些任务,并使用
ThreadPoolExecutor
并行执行这些任务。显然,在循环中串行运行它们要慢得多,然后通过
ThreadPoolExecutor
运行它们可以显著提高性能。但是,我仍然不满意
ThreadPoolExecutor
的性能

我能够在4个内核上使用15个线程运行所有8000000个任务。在将任务提交到
ThreadPoolExecutor
时,我正在批处理50000个任务。我允许
ExecutorCompletionService
返回结果的超时时间为1000毫秒。使用这些参数调整应用程序后,我将有大约25分钟的时间来处理所有8000000个任务

有没有办法让我的应用程序运行速度超过25分钟,比如Hadoop(使用多台机器的分布式系统)?我愿意使用其他一些技术或框架。

这说明Akka如何帮助完成并行任务

我对Akka没有任何实际操作经验,但我的理解是,它负责根据部署时的配置(例如,集群中的线程、进程、主机的数量…)扩展应用程序,而对任务实现几乎没有更改


有关Wikipedia的更多信息:

为了找到最佳线程数,您必须查看单个任务

如果该任务以独占方式使用该内核,则其他任务不能在同一内核上执行。但是,大多数任务都有一些IO元素,例如读取数据进行处理和写回结果(假设您的任务是一些复杂的计算)

线程计数应大约为
'核心数量
'x
'利用率
其中,利用率百分比是介于0和1之间的调整参数。使用以下命令动态查找核心计数:

int cores = Runtime.getRuntime().availableProcessors();
所以

如果随后需要缩放,可以水平缩放或垂直缩放

在水平方向上,更多的内核将调整吞吐量,但如果任务之间的同步太多,则利用率可能不是线性的

从纵向上看,更多的计算机肯定会给你更多的计算核心。因此,加工农场一直都很有趣,因为其成本高于水平规模。然而,分发成本和分发要计算的数据的成本始终是下一个问题

正如所评论的,Hadoop通过在分区中分发数据并将计算发送到数据来解决这个问题。这对于使用简单合并的分而治之类型的任务非常有效

Cassandra还评论说,它提供了一个分布式数据库,通过提交日志和选择性读/写一致性处理分区写。这基本上可以更快地移动数据,但我怀疑您并不是太依赖于此

除了这些注释之外,您还需要查看您的任务内部,了解它们是如何构思的,以及它们应该实现什么,特别是关于分而治之的性质,或顺序/管道性质。正如所建议的那样,Akka在异步任务的执行过程中提供了很多帮助,并在同步障碍方面提供了帮助


最后,我的最后一条建议是查看LMAX Disruptor()。这应该允许您以非常高的吞吐量在各个阶段之间传递工作负载。这(再加上优化的核心控制)可能会提高您的速度,而无需重新考虑场景。

Hadoop或Cassandra可能会有所帮助,这取决于您是否遇到了问题。您的任务是否可以更高效?您只需将应用程序复制到10台机器上,将800万个任务分成10个部分,并在10台计算机上单击“运行”10次增加线程数会有所帮助,但这也需要更多的内核数才能看到性能的提高。您确定您的程序受CPU限制吗?您是否丢弃了创建的对象?有什么可以重复使用的吗?
int poolcount = Math.round( cores * utilizationFactor);