2013-01-10 31 views
-1

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

+0

有点代码会有助于回答这个问题。 –

+0

为什么为什么为什么?一个100行字的文本文件不需要8个线程来处理。你在浪费资源和做傻事。 STAHP –

+0

将100个句子翻译成6种不同的语言,并对文字执行字数统计操作 –

回答

1

大多数情况下,您的开销可能比CPU利用率更高。

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

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

+0

我甚至有500个句子文件,同样的情况也是如此,整个过程涉及到将文本翻译成6种不同的语言 –

+0

在这种情况下,我会翻译一种语言每个线程,一个线程读取到句子。这应该是CPU密集型的。我假设你正在使用Java进行翻译而不使用任何外部资源或服务。 –

1

如果每个线程也应该从文件中读取句子并处理它,那么我怀疑磁盘在这种情况下是瓶颈。从单个磁盘进行并行读取通常会导致单次顺序读取性能下降。

在我看来,你应该把所有东西都留给一个线程,或者至少使用一个生产者 - 多个消费者模式来串行化阅读和并行处理句子处理。

2

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

0

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

相关问题