2017-03-22 45 views
1

對於我的工作,我必須開發一個解析非常大的文本文件(〜6800 kb)的小型Java應用程序,所以我正在嘗試優化它以創建更進一步的流程。用equalto(=)分割線作爲第一個分叉任務,並用逗號分割並使用第二個分叉任務進行一些計算。這將導致對單個應用程序執行多個分叉任務的良好性能。使用多個fork和join類來分割任務,是不是一個好習慣?

1)首先fork和join過程:

@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)第二fork和join過程:

@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線程池或fork和join可以提供更好的性能嗎? – usha

+0

當你有一個大任務時,分叉連接池可以提供更好的性能和強大的解決方案,但在這種情況下開銷更大。您需要查看盜用Fork /加入池中的工作。 –

相關問題