2016-12-02 52 views
0

我一直在研究Storm拓撲,我從「Execute(tuple)」方法中的文件中讀取並且java拋出「Java .lang.OutOfMemoryError:超出GC開銷限制「。 該程序工作正常,直到它拋出該錯誤,因爲太多的GarbageCollector(我認爲)的使用。使用過的相同代碼完美無瑕,問題在於Storm實現的極端併發。 我認爲那是因爲程序在垃圾收集器上花費了太多時間,並且我編寫它的方式,我認爲它每次執行元組時都會爲同一個文件和Bolt創建很多讀者。我想知道是否可以在「Prepare()」方法中讀取文件,將它保存在一個String數組中,如果是這樣,我會問:它是否只爲一個Bolt實例創建一個reader和String數組?風暴閱讀文件拋出「Java.lang.OutOfMemoryError:超過GC開銷限制」

這裏是我的博爾特的樣本:

public static class FilterSomeBolt extends BaseRichBolt { 
     OutputCollector _collector; 

     public void prepare(Map conf, TopologyContext context, OutputCollector collector) { 
      _collector = collector; 
     } 

     public void execute(Tuple tuple) { 

      String entr = tuple.getString(1); 

      boolean flagRet=false; 

      try { 
       String fileName2 = (String)"file.csv"; 
       BufferedReader reader2 = new BufferedReader(new FileReader(fileName2)); 
       // read and ignore the header if one exists 

      String line2 =reader2.readLine(); 
      while(line2!= null){ 
        if(line2.toLowerCase().contains("something")&&line2.toLowerCase().contains(entr.substring(1, 8).toLowerCase())){ 

         flagRet=true; 
        }//end if 
      line2 =reader2.readLine(); 

     }//end while 
}.......................... 
............................//tuple sent 

我試圖瞭解這些方法,並希望得到幫助。 在此先感謝!

回答

0

您的文件讀取邏輯正在創建問題。如果文件的第一行不是null,那麼while循環將運行無數次。請更新下面的代碼片段:

while((line2 =reader2.readLine())!= null){ 
    ....//do anything you want 
} 

希望這會有所幫助。

+0

對不起,我沒有把line2的更新,但它是在那裏,我會編輯的問題,該bucle完成恰到好處,錯誤不存在,謝謝! – Amnor

+0

現在,雖然就像我有一個,我正在削減一些代碼,我現在不會造成這個問題,我錯過了「line2」變量更新,謝謝你的頭! – Amnor

+0

幫助,因爲我錯過了發佈「line2」更新的問題,但它不是解決方案,因此我的代碼實際上已更新其中的行。我很感激幫助,但問題仍然存在,所以我提出了你的答案,但我不能接受它是正確的,因爲你幫助發佈問題,但不是在編程問題上接受問題,它必須解決問題編程問題。 感謝您的幫助,意識到我忘了帖子上的line2更新,無論如何:) – Amnor

相關問題