我一直在研究一个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
}
}
我正在努力理解这些方法,并将感谢您的帮助。提前谢谢!
1条答案
按热度按时间njthzxwz1#
您的文件读取逻辑正在创建问题。如果文件的第一行不是空的,那么while循环将运行无限次。请更新以下代码段:
希望这有帮助。