2016-12-02 8 views
0

Я работал над топологией Storm, я прочитал из файла в методе «Выполнение (кортеж)» и java выбрасывает мне «Java .lang.OutOfMemoryError: превышен верхний предел GC ". Программа отлично работает, пока она не выкинет эту ошибку из-за слишком большого использования GarbageCollector (я думаю). Один и тот же код, который используется, работает отлично, проблема заключается в крайнем совпадении моей реализации Storm. Я думаю, что это потому, что программа тратит слишком много времени на сборщик мусора, и, как я его запрограммировал, я думаю, что он создает много читателей для одного и того же файла и Bolt каждый раз, когда он выполняет кортеж. Мне было интересно, можно ли прочитать файл в методе «Подготовить()», сохранить его в массиве String, и если это так, я спрашиваю: будет ли он создавать только один считыватель и массив String для одного экземпляра Bolt?Storm чтение файлов бросает «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

Логика чтения файлов создает проблему. Если первая строка файла не равна нулю, ваш цикл while будет выполняться бесконечно много раз. Обновите его после фрагмента кода:

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

Надеюсь, это поможет.

+0

Извините, я не поместил обновление строки2, но оно есть, я отредактирую вопрос, купила, заканчивая в самый раз, ошибки нет, спасибо! – Amnor

+0

теперь пока что похоже на то, что у меня есть, я сокращал код, который я сейчас не вызываю, и я пропустил обновление переменной «line2», спасибо за головы! – Amnor

+0

Помог, потому что я пропустил, чтобы опубликовать обновление «line2» на вопрос, но это не решение, поэтому мой код действительно имеет это обновление строки в нем. Я ценю помощь, но вопрос все еще остается, поэтому я поддержал ваш ответ, но я не могу принять его как правильно, потому что вы помогли в публикации вопроса, но не в проблеме программирования, чтобы принять вопрос, он должен решить проблема программирования. Спасибо за вашу помощь, поняв, что я забыл обновление строки2 на почте, так или иначе :) – Amnor

 Смежные вопросы

  • Нет связанных вопросов^_^