我有一组非常大的文本文件。任务是计算这个庞大语料库中所有术语(唯一)的文档频率(包含特定术语的文档数量)。简单地从第一个文件开始并以序列化的方式计算所有内容似乎是一件愚蠢的事情(我承认我这样做只是为了看看它有多么灾难性)。 我意识到,如果我以 Map-Reduce 方式进行此计算,这意味着将我的数据聚类成更小的部分并最终聚合结果,我将更快地获得结果。
我的 PC 有 4 个内核,所以我决定将我的数据分成 3 个不同的子集,并将每个子集提供给一个单独的线程,等待所有线程完成它们的工作,并将它们的结果传递给另一个方法来聚合所有内容。
我用非常小的一组数据对其进行了测试,效果很好。在使用实际数据之前,我用更大的数据集对其进行了测试,以便更好地研究其行为。我启动了 jvisualvm 和 htop 来查看 cpu 和内存是如何工作的。我可以看到有 3 个线程正在运行,cpu 内核也很忙。但这些核心的使用率很少超过 50%。这意味着我的应用程序并没有真正使用我的 PC 的全部功能。这与我的代码有关,还是应该如此。我的期望是每个线程使用尽可能多的 cpu 核心资源。
我使用 Ubuntu。
最佳答案
在我看来,您有一个 IO 绑定(bind)应用程序。您花费更多的时间在您的各个线程中读取磁盘中的数据,然后您实际处理读取的信息。
您可以通过将您的程序迁移到另一个带有 SSD 的系统来测试这一点,以查看 CPU 性能是否发生变化。您还可以读入所有文件,然后稍后处理它们,以查看这是否会在处理时间内改变 CPU 曲线。我怀疑它会。
关于java - 如何插入代码使用尽可能多的 CPU 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14401519/