【发布时间】:2016-12-02 09:39:49
【问题描述】:
我一直在研究 Storm 拓扑结构,在该拓扑结构中,我使用 execute(tuple) 方法从文件中读取数据,Java 向我抛出了 Java.lang.OutOfMemoryError: GC overhead limit exceeded。
该程序运行良好,直到它抛出该错误。我猜这是因为对垃圾收集器(GC)的调用过多。曾经使用的相同代码可以完美运行,问题是我的 Storm 实现的极端并发。
我认为我的程序在 GC 上花费了太多时间。我编写它的方式是为同一个文件创建大量阅读器,并在每次执行元组时创建 Bolt。
我想知道是否可以在prepare() 方法中读取文件,然后将其保存在字符串数组中?如果是这样,我问,它会不会只为一个 Bolt 实例创建一个阅读器和字符串数组?
这是我的 Bolt 示例:
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
}
}
我正在尝试了解这些方法,希望能得到帮助。 提前致谢!
【问题讨论】:
标签: java file garbage-collection apache-storm java-io