如何优化基于正则表达式的大型日志文件解析?

时间:2015-04-27 09:33:48

标签: java regex parsing logfile

我当前创建了所需的函数来解析一个长达数十万行的日志文件(可能)。现在问题是我通过double-for-loops搜索线程ID 0..19,如下所示:

for(int i = 0; i < 20; i++) {
    for(int j = JAnalyzer.csvlog.size()-1; j >= 0; j--) {
        if(JUtility.hasThreadHung(JAnalyzer.csvlog.get(j), i)) {
            listOfHungThreads.add(JAnalyzer.csvlog.get(i));
            noThreadsHung++;
        }
    }
}

原因是我需要在整个文件中搜索每个线程ID。因此,我的问题是,是否有更有效的方法来处理这样的程序,因为我以前从未解决过这种情况。

以下是hasThreadHung方法。

public static boolean hasThreadHung(final String str, final int threadId) {     
    String pattern = "ScriptExecThread\\(" + Integer.toString(threadId) + "\\).*.starting.*.on";
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(str);
    boolean hasHung = m.find();
    m.reset();
    return hasHung;
}

请不要考虑这种过早的优化。目前处理这个问题的方法花了太长时间。

1 个答案:

答案 0 :(得分:1)

我建议如下。它将在给定的字符串中搜索挂起的线程模式并返回线程的编号(如果找到它),如果没有线程挂起,则返回null

final static Pattern PATTERN = Pattern.compile( "ScriptExecThread\\(([0-9]+)\\).*.starting.*.on" );

public static String getHungThread(final String str ) {     
    Matcher m = PATTERN.matcher(str);
    boolean hasHung = m.find();
    if ( hasHung ) {
      return m.group(1);
    } else {
      return null;
    }
}