我们将在Java中实现用于各种统计分析的软件。主要概念是在图上获取点数组,然后通过它迭代并找到一些结果(如寻找最长的上升序列和各种指标)。
问题:大量数据
问题2 :还必须在客户端的PC上运行,而不仅仅是服务器(不能进行特定的服务器调整)
部分解决方案:在后台进行计算,让用户盯着空屏等待结果:(
问题:有没有办法如何使用并行性来提高计算本身的性能(大量迭代)?如果是这样,请提供文章,样本以及此处可用的任何内容的链接......
答案 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)
如果您要解决的问题自然可以并行化,那么可以使用多线程来提高性能。
如果有许多部分应该连续计算(即在计算第一部分之前你不能计算第二部分),那么多线程就不是了。
描述具体问题,也许,我们将能够为您提供更多帮助。