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

How to optimize regex-based parsing of large log file?

我目前已经创建了所需的函数来解析一个(可能)长达数十万行的日志文件。现在的问题是我通过双循环搜索线程 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;
}

请不要考虑这种过早的优化。目前的处理方式太耗时了。

我建议如下。它将在给定的字符串中搜索挂起线程模式和 return 线程编号(作为字符串)(如果找到),或者 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;
    }
}