如何推动代码尽可能多地使用CPU资源?

时间:2013-01-18 14:56:02

标签: java multithreading performance mapreduce

我有一大堆文本文件。任务是计算这个巨大语料库中所有术语(唯一)的文档频率(包含特定术语的文档数)。简单地从第一个文件开始并以序列化方式计算所有内容似乎是一件愚蠢的事情(我承认我这样做只是为了看它是多么灾难性的)。 我意识到如果我以Map-Reduce方式进行计算,意味着将我的数据聚类成更小的部分,最后聚合结果,我会更快地得到结果。

我的电脑有4个内核,因此我决定将我的数据分成3个不同的子集,并将每个子集提供给一个单独的线程,等待所有线程完成工作并将结果传递给另一个方法来聚合所有内容。

我用一小组数据测试它,被罚款。在我使用实际数据之前,我用更大的设置测试它,我可以更好地研究它的行为。我开始使用jvisualvm和htop来查看cpu和内存是如何工作的。我可以看到3个线程正在运行,cpu核心也很忙。但这些核心的使用率很少超过50%。这意味着我的应用程序并没有真正使用我的PC的全部功能。这与我的代码有关,或者这是它应该如何。我的期望是每个线程尽可能多地使用cpu核心资源。

我使用的是Ubuntu。

4 个答案:

答案 0 :(得分:3)

听起来你有一个IO绑定的应用程序。您花费更多时间在各个线程中从磁盘读取数据,然后您实际上正在处理读取的信息。

您可以通过将程序迁移到具有SSD的另一个系统来测试这一点,以查看CPU性能是否发生变化。您还可以读入所有文件,然后稍后处理它们以查看是否在处理时间内更改了CPU曲线。我怀疑它会。

答案 1 :(得分:2)

正如已经说过的那样,你可能会被磁盘IO所困扰。尝试将从磁盘读取的代码与处理数据的代码分开,并为每个代码使用单独的线程池。之后,快速扩展线程池以适合您的资源的一种好方法是使用Executors个线程池之一。

答案 2 :(得分:1)

您在一台计算机上遇到类似问题的IO绑定,而不是CPU限制。你在积极阅读文件吗?只有当你将所有文件都放在内存中时才会开始使CPU饱和。这就是map-reduce有效的原因。它比CPU更能扩展总IO吞吐量。

答案 3 :(得分:0)

如果你在Linux上并且使用tmpfs将数据存储在内存中而不是在磁盘上,你可以加快这一点。