2014-03-03 32 views
0

我正在爲一個大語料庫處理50個單詞的互信息。我需要對這些目標詞和它們每個詞的鄰居詞進行統計。我是否應該使用一個線程來更新數組中每個對象的值

有一個大小爲50的對象數組,每個單詞一個。

我有一個線程來讀取行。當有新行進入時,我需要更新所有這些對象的值。

我想用多線程書寫方式。

我應該使用50個線程,每個線程負責這個數組中的一個對象嗎?

如果我爲每個對象使用一個線程,我應該使用50個隊列來存儲輸入行,並且每個線程使用一個隊列嗎?

我想生產者 - 消費者模式,但它看起來有點不同的地方只有一個隊列......在多核/多CPU機器上運行時

+0

需要更多信息 - 您的一致性要求是什麼?例如,在處理下一行之前是否需要用一行更新所有對象? – DNA

+0

問:在處理下一行之前是否需要使用一行更新所有對象 - 不需要 –

+0

首先,我不明白爲什麼需要以多線程方式執行此操作。其次,如果你必須這樣做,我不建議你爲這個任務打開50個線程。 – albusshin

回答

0

多線程是最有利的。應該從機器上的可用內核數量推斷出線程的數量。如果有5個核心可用,應該分離出5個線程。由於CPU上下文切換,任何更多的線程和你可能開始失去效率。

這裏是你如何能做到這一點的例子:

int coreCount = Runtime.getRuntime().availableProcessors(); 
for(int i = 0; i < coreCount; i++) { 
    Thread thread = new YourThreadClass(); 
    thread.start(); 
} 
0

這是一個有點混亂,你的意圖是什麼。我會盡量一般性地討論它。不建議有更多的線程運行,而不是CPU核心(有些人認爲它是這個數字的兩倍),因爲在那之後,你不會獲得更多的執行速度,但的確支付罰款。 你也應該考慮你的「新行」輸入的效果是什麼。如果所有的對象都以相同的方式更新,那麼不需要那麼多的隊列,一個就足夠了。 如果這些對象是單獨更新的,在不依賴時間的情況下,您可以按照您建議的50個具有50個隊列的線程來實現它,但如果更新是一致的,則應考慮使用較少的線程找到合適的解決方案(可能存在某些邏輯您的對象之間的連接,這可以幫助您將它們中的一些分組在較少的線程中)

+0

更新更多信息,希望對您有所幫助。 –

+0

好吧,如果你真的選擇了50個線程,你可以按如下方式實現它:你的閱讀器線程讀取一行,解析它並將這些單詞放入適當的隊列中(其中50個),而這些隊列被單獨的線程清空。話雖如此,你應該考慮這些單詞之間是否存在任何依賴關係,例如隊列A中的第7個單詞需要隊列A的第5個單詞。這是一個很好的練習。我的建議是有兩個線程,一個從行首開始,另一個在和,每個都更新其適當的對象,不需要隊列。 – user3209815

相關問題