我应该考虑统计计算中的并行性吗?

时间:2010-12-05 16:15:24

标签: java parallel-processing

我们将在Java中实现用于各种统计分析的软件。主要概念是在图上获取点数组,然后通过它迭代并找到一些结果(如寻找最长的上升序列和各种指标)。

问题:大量数据

问题2 :还必须在客户端的PC上运行,而不仅仅是服务器(不能进行特定的服务器调整)

部分解决方案:在后台进行计算,让用户盯着空屏等待结果:(

问题:有没有办法如何使用并行性来提高计算本身的性能(大量迭代)?如果是这样,请提供文章,样本以及此处可用的任何内容的链接......

3 个答案:

答案 0 :(得分:3)

使用并行处理的要点是存在大量数据大型计算可以在没有彼此的情况下执行。例如,您可以通过在部件1..1000,1001..2000,2001..3000等上分割它来计算具有多个线程的10000的阶乘,处理每个部分然后使用*累积结果。另一方面,你不能分割计算大斐波纳契数的任务,因为后者依赖于之前的数。

大量数据也是如此。如果你已经收集了一些点并希望找到一些具体的点(大于一些常数,最大值)或者只是收集统计信息(坐标之和,出现次数),则使用并行计算。如果你需要收集“正在进行的”信息(最长的上升顺序)......好吧,这仍然是可能的,但更难。

服务器和客户端PC之间的区别在于客户端PC没有多个内核,单核上的并行计算只会降低性能,而不会增加。因此,不要创建比用户PC内核数量更多的线程(对于计算集群也是如此:不要将任务拆分为多于子集中的计算机数量的任务)。

Hadoop's MapReduce 可让您有效地创建并行计算。您还可以搜索更具体的Java库,以便并行进行评估。例如,Parallel Colt实现了高性能并发算法,适用于大型矩阵,并且有许多此类库用于许多数据表示。

答案 1 :(得分:2)

除了Roman所说的,你应该看看客户端的PC是否有多个CPU / CPU内核/超线程。如果只有一个CPU具有单核并且没有超线程,那么您将无法从并行化计算中受益。否则,它取决于计算的性质。

如果要进行并行化,请确保使用Java 1.5+以便可以使用并发API。在运行时,确定Runtime.getRuntime().availableProcessors()等CPU核心数。对于大多数任务,您将需要使用许多线程(如Executors.newFixedThreadPool(numThreads))创建线程池,并将任务提交给Executor。为了更具体,你必须提供有关你的特定计算的信息,正如罗马建议的那样。

答案 2 :(得分:1)

如果您要解决的问题自然可以并行化,那么可以使用多线程来提高性能。

如果有许多部分应该连续计算(即在计算第一部分之前你不能计算第二部分),那么多线程就不是了。

描述具体问题,也许,我们将能够为您提供更多帮助。