2013-01-10 72 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毫秒也不值得。在具有多個套接字的大型機器上運行時,由於緩存一致性開銷增加,該閾值甚至更高。

相關問題