在多核集群节点上并行运行Java应用程序

4
我有一个Java程序,用于计算两个文档之间的语义相似度。该程序从指定的文件系统检索文档并计算相似度。大约有20万个这样的文档。
我创建了10个线程来完成此任务,并将数据块分配给每个线程。例如,将文档1-20000分配给第一个线程,将20001-40000分配给下一个线程,依此类推。
目前,我在一台8 CPU核心的机器上运行上述程序。计算需要很长时间才能完成。
我想在一个拥有64个核心的5节点Linux集群上运行该程序。
  • 是否有像EXECUTOR Framework这样的Java框架可以完成此任务?
  • 有没有办法计算最大可生成的线程数?
    如果您有任何解决此问题或改进的建议,请提供。

你是将这200000个文档中的每一个与一个预定义的文档进行比较,还是与其他所有文档进行比较? - Alexei Kaigorodov
你问了我正在寻找的同样的问题,这是一个非常好的问题,加一分(y) - Simmant
2个回答

4

有没有像EXECUTOR框架这样的Java框架可以完成此任务?

我建议您看一下Akka框架,用于编写强大的并发和分布式应用程序。Akka使用Actor模型以及软件事务内存来提高抽象级别,并提供更好的平台来构建正确的并发和可扩展的应用程序。

查看逐步教程,了解如何使用Akka框架构建分布式应用程序的更多信息。

通常情况下,使用Java-RMI在Java中构建分布式应用程序,它在内部使用Java的内置序列化传递节点之间的对象。

是否有一种方法来计算可以生成的最大线程数?

我们使用的简单规则是将其设置为高于系统中可用的逻辑核心的数量。更高的值取决于我们要执行的操作类型。例如,如果计算涉及IO通信,则将线程数设置为2 *可用逻辑核心(而不是物理核心)。

我们使用的其他想法:

  • 通过逐个增加线程数来测量CPU利用率,并在CPU利用率接近90-100%时停止
  • 测量吞吐量,并在吞吐量保持或开始下降的点上停止

0

Java的Fork/Join框架是你的好朋友。正如该框架的开头所说:

fork/join框架是ExecutorService接口的一种实现,它可以帮助你利用多个处理器。它专为可以递归地分解成较小部分的工作而设计。目标是利用所有可用的处理能力来提高应用程序的性能。

关于你可以生成多少线程 - 我认为没有硬性规定,这取决于情况。因此,可以尝试从5或其他数字开始,然后根据结果不断增加或减少。
此外,您可以分析现有的最大和最小线程数,并将其与CPU利用率等进行对比,然后像这样继续了解系统的行为方式。如果您的应用程序部署在应用服务器中,请检查其线程模型以及他们对线程容量的建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接