storm读取文件抛出“java.lang.outofmemoryerror:超出gc开销限制”

aor9mmx1  于 2021-06-21  发布在  Storm
关注(0)|答案(1)|浏览(471)

我一直在研究一个storm拓扑,在这个拓扑中我从 execute(tuple) 方法和java给了我一个 Java.lang.OutOfMemoryError: GC overhead limit exceeded . 程序运行正常,直到抛出错误。我猜这是因为对垃圾收集器(gc)调用太多。曾经使用过的相同代码工作得很完美,问题是我的storm实现的极端并发性。我觉得我的程序花在gc上的时间太多了。我编程的方式是为同一个文件创建很多读卡器,每次它执行一个元组时都会出错。
我想知道是否有可能在图书馆里读这个文件 prepare() 方法,然后将其保存在字符串数组中?如果是这样,我会问,它会不会只为一个bolt示例创建一个reader和string数组?
以下是我的螺栓示例:

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
  }
}

我正在努力理解这些方法,并将感谢您的帮助。提前谢谢!

njthzxwz

njthzxwz1#

您的文件读取逻辑正在创建问题。如果文件的第一行不是空的,那么while循环将运行无限次。请更新以下代码段:

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

希望这有帮助。

相关问题