我一直在研究Storm拓扑,我从" Execute(tuple)"中的文件中读取。方法和java抛出了一个" Java.lang.OutOfMemoryError:超出GC开销限制"。 该程序正常工作,直到它抛出该错误,因为GarbageCollector的使用太多(我认为)。使用相同的代码一次完美,问题是我的Storm实现的极端同意。 我认为这是因为程序在垃圾收集器上花费了太多时间,以及我编写它的方式,我认为它为同一个文件和Bolt每次执行元组创建了很多读者。我想知道是否可以在" Prepare()"中读取文件。方法,将它保存在String数组中,如果是这样,我问:它是否只为一个Bolt实例创建一个读取器和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
}..........................
............................//tuple sent
我试图理解这些方法,并希望得到帮助。 提前谢谢!
答案 0 :(得分:0)
您的文件读取逻辑正在创建问题。如果第一行文件不为null,则while循环将运行无限次。请在代码段后更新它:
while((line2 =reader2.readLine())!= null){
....//do anything you want
}
希望这有帮助。