2017-03-22 4 views
1

私の仕事では、非常に大きなテキストファイル(〜6800 kb)を解析する小さなJavaアプリケーションを開発する必要があります。そのため、それをさらに最適化して処理を進めようとしています。最初のフォークタスクとして等号(=)を使用し、2番目のフォークタスクを使用してコンマでいくつかの計算を分割する。これは、単一アプリケーションのために複数のフォークタスクを備えた良好なパフォーマンスにつながりますか?複数のフォークを使用してタスクを分割するクラスを結合する、良い方法ですか?

1)まずフォークとプロセスへの参加:

@Override 
protected Map < String, String > compute() { 
SplitString lineSplit = new SplitString(); 
Map < String, String > splitUrl = new HashMap < >(); 
// list size is less than limit process actual task. 

if (readAllLines.size() < Constant.LIMIT) { 
    // splitUrl map stores the splitter lines with equal_to 
    splitUrl = lineSplit.splittingLines(readAllLines); 

} else { // list size greater than limit splits task in to two and process it. 
    // split task into sub task and stores it in list 
    List <String> left = readAllLines.subList(Constant.ZERO, readAllLines.size()/2); 
    List <String> right = readAllLines.subList(readAllLines.size()/2, readAllLines.size()); 
    SplitTask firstTask = new SplitTask(left); 
    SplitTask secondTask = new SplitTask(right); 
    // forks the firstTask 
    firstTask.fork(); 
    // forks the secondTask 
    secondTask.fork(); 
    // join the task in splitUrl map 
    splitUrl.putAll(firstTask.join()); 
    splitUrl.putAll(secondTask.join()); 
} 
return splitUrl; 
} 

2)は、第2のフォークとプロセスへの参加:

@Override 
protected Map < String, Map < String, Integer >> compute() { 
    SplitString ruleSplit = new SplitString(); 
    Map < String, Map < String, Integer >> response = new HashMap < >(); 
    // list size is less than limit process actual task. 

    if (KeyList.size() < Constant.LIMIT) { 
     // splitUrl map stores the splitter lines with equal_to 
     response = ruleSplit.calculatingRuleTime(result, KeyList); 

    } else { // list size greater than limit splits task in to two and process it. 
     // split task into sub task and stores it in list. 
     List <String> left = KeyList.subList(Constant.ZERO, KeyList.size()/2); 
     List <String> right = KeyList.subList(KeyList.size()/2, KeyList.size()); 
     SplitRuleTask firstTask = new SplitRuleTask(result, left); 
     SplitRuleTask secondTask = new SplitRuleTask(result, right); 
     // forks the firstTask 
     firstTask.fork(); 
     // forks the firstTask 
     secondTask.fork(); 
     // join the task in response map 
     response.putAll(firstTask.join()); 
     response.putAll(secondTask.join()); 
    } 
    return response; 
} 

は、誰も私を助けてくださいことができますか?

答えて

0

フォークも重量プロセスを作り出しています。スレッドコンセプトを読んで、それらにマルチスレッドを実装することをお勧めします。 より進んだ方法は、作業するスレッドプールを作成することです。以下のリンクを読むことをお勧めします。

+0

答えとして外部リンクを提供しないでください。 –

+0

パフォーマンスを向上させるJavaスレッドプールまたはフォークとジョインを使用しますか? – usha

+0

フォーク結合プールは、大きなタスクがある場合にパフォーマンスが向上し、堅牢なソリューションを提供しますが、オーバーヘッドはこの場合より多くなります。あなたはフォーク/ジョインプールで仕事を盗み出すことを調べる必要があります。 –

関連する問題