我有一个Java程序,可以计算两个文档之间的语义相似性。程序从指定的文件系统中检索文档并计算相似性。大约有2,00,000个这样的文档
我为此任务创建了10个线程,并为每个线程分配了数据卡盘。对于前者文件1-20000为第一个线程,20001-40000为下一个线程,依此类推
目前我在8 CPU核心机器上运行上述程序。它花了很多时间来完成计算
我想在5节点Linux集群上运行该程序,其中每个节点有64个核心。
答案 0 :(得分:4)
Java中是否有像EXECUTOR Framework这样可以执行此任务的框架?
我建议你看一下Akka framework来写强大的并发&分布式应用。 Akka将Actor模型与软件事务内存一起使用,以提高抽象级别,并为构建正确的并发和可伸缩应用程序提供更好的平台。
逐步了解tutorial,它提供了有关如何使用Akka框架构建分布式应用程序的更多信息。
通常,分布式应用程序使用Java-RMI在Java中构建,内部使用Java的内置序列化在节点之间传递对象。
有没有办法计算一个人可以产生的最大线程数?
我们使用的简单规则是,设置为高于系统中可用逻辑核心的值。价值多高取决于我们的运营类型。例如,如果计算涉及IO通信,则将线程数设置为2 *个可用逻辑核(不是物理核)。
我们使用的其他想法,
答案 1 :(得分:0)
Java Fork/Join framework是你的朋友。正如该框架的开场陈述所说:
fork / join框架是ExecutorService的一个实现 界面,可以帮助您利用多个处理器。它是 专为工作而设计,可以递归地分成小块。 目标是使用所有可用的处理能力来增强 你的申请表现。
关于你可以产生多少线程 - 我认为没有这样的硬性和快速的规则,这取决于。所以可以尝试从5左右的数字开始,然后根据结果继续增加或减少 此外,您可以分析现有的最大和最小线程数,并将其与CPU利用率等进行对比,并按此操作以了解系统的行为方式。如果您的应用程序部署在应用程序服务器中,请检查其线程模型以及它们对线程容量的看法。