解析が必要な長いテキスト行が数百万行あるとします。
私の i7 2600 CPU では、1000 行ごとに解析するのに約 13 ミリ秒かかります。
したがって、1,000,000 行の解析には約 13 秒かかります。
実行時間を短縮するために、複数のスレッドを使用して管理しました。
ブロッキング キューを使用して、1,000,000 行をそれぞれ 1,000 行を含む 1,000 チャンクのセットとしてプッシュし、8 スレッドを使用してチャンクを消費します。コードは単純で機能しているように見えますが、パフォーマンスは期待できるものではなく、約 11 秒かかります。
マルチスレッド コードの主な部分は次のとおりです。
for(int i=0;i<threadCount;i++)
{
Runnable r=new Runnable() {
public void run() {
try{
while (true){
InputType chunk=inputQ.poll(10, TimeUnit.MILLISECONDS);
if(chunk==null){
if(inputRemains.get())
continue;
else
return;
}
processItem(chunk);
}
}catch (Exception e) {
e.printStackTrace();
}
}
};
Thread t=new Thread(r);
threadList.add(t);
for(Thread t: threads)
t.join();
ExecutorService も使用しましたが、パフォーマンスが低下します。
チャンク サイズを変更しても効果はなく、パフォーマンスは向上しません。
これは、ブロッキング キューがボトルネックではないことを意味します。
一方、シリアル プログラムの 4 つのインスタンスを同時に実行すると、4 つのインスタンスすべてが完了するまでに 15 秒しかかかりません。これは、15 秒で 4 つのプロセスを使用して 4,000,0000 行を処理できることを意味し、したがって、速度アップは約 3.4 であり、マルチスレッドの 1.2 速度アップと比較して非常に有望です。
誰かがこれについて何か考えを持っているのだろうか?
問題は非常に単純です。ブロッキング キュー内の一連の行と、キューからアイテムをポーリングして並列処理する複数のスレッドです。スレッドが完全にビジーであるため、キューは最初にいっぱいになります。
私も以前に同様の経験をしましたが、マルチプロセッシングが優れている理由がわかりません。
また、Windows 7 でテストを実行し、1.7 JRE を使用していることにも言及する必要があります。
どんなアイデアでも大歓迎です。事前に感謝します。