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