-1

我有一个带有 10 个线程和大量文本数据要处理的线程池,我正在并行运行这些线程,我无法利用核心 i7 vPro 处理器的完整 cpu 资源,有人帮我解决这个问题。我想要最大的 CPU 利用率。

4

4 回答 4

2

在许多情况下,不是在每个线程中做同样的事情做单独的工作并使用同步队列进行通信会产生更好的结果。尝试拆分应用程序,以便所有读取操作都从单个线程完成,然后将数据提供给工作线程进行处理,另一个线程进行后处理(如果有的话)。您可能会发现这样的模型使用了更多的处理能力并且工作速度明显更快。

于 2013-01-10T14:52:24.903 回答
1

如果每个线程除了处理它之外还应该从文件中读取句子,那么我怀疑磁盘是这种情况下的瓶颈。从单个磁盘并行读取通常会导致相对于单个顺序读取的性能下降。

在我看来,您应该将所有内容留给单个线程,或者至少使用单个生产者-多消费者模式序列化阅读并仅并行化句子处理。

于 2013-01-10T14:39:15.533 回答
1

很可能您的开销比 CPU 利用率更高。

  • 这可能是因为读取文件并将其分解成句子需要时间。由于您没有看到 100% CPU,这是我的猜测。
  • 启动任务并将任务添加到其他线程的开销大于每个任务所做的工作量。您会期望看到接近 100% 的 CPU 利用率,但速度远低于您的预期。它甚至可能比使用一个线程慢。

除非您的 JVM 已预热,否则您可能会发现这比使用多线程更重要。(100 个句子的文件是不够的)

于 2013-01-10T14:30:43.997 回答
0

多线程会带来一些开销,包括将任务细分为作业,将作业提供给作业队列,然后让ThreadPoolExecutor执行作业,可能在完成时组合结果。即使没有由于磁盘访问或其他共享资源而导致的争用,我发现将作业细分为小于 1 毫秒也不值得开销。在具有多个套接字的大型机器上运行时,由于缓存一致性开销增加,该阈值甚至更高。

于 2013-01-10T15:02:57.080 回答