gpt4 book ai didi

java - 我怎样才能以最佳性能进行过滤? (Java)

转载 作者:行者123 更新时间:2023-11-29 08:18:48 25 4
gpt4 key购买 nike

我在一个小办公室工作,我有一个应用程序,它生成一个包含 14000 行的大文本文件;

每次生成后我都必须过滤它,这真的很无聊;

我想用 java 写一个应用程序,直到我能尽快处理它。

请帮帮我;我用扫描仪写了一个应用程序(当然有帮助:))但它并不好因为它很慢;

例如这是我的文件:

SET CELL:NAME=CELL:0,CELLID=3;
SET LSCID:NAME=LSC:0,NETITYPE=MDCS,T32=5,EACT=FILTER-NOFILTER-MINR-FILTER-NOFILTER,ENSUP=GV2&NCR,MINCELL=6,MSV=PFR,OVLHR=9500,OTHR=80,BVLH=TRUE,CELLID=3,BTLH=TRUE,MSLH=TRUE,EIHO=DISABLED,ENCHO=ENABLED,NARD=NAP_STLP,AMH=ENABLED(3)-ENABLED(6)-ENABLED(9)

我想要这个输出(过滤器 :)

CELLID :  3
ENSUP : GV2&NCR
ENCHO : ENABLED
MSLH : TRUE
------------------------
Count of CELLID : 2

哪个解决方案比其他解决方案最好、最快?

这是我的源代码:

public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new File("i:\\1\\2.txt"));
scanner.useDelimiter(";|,");
Pattern words = Pattern.compile("(CELLID=|ENSUP=|ENCHO=)");

while (scanner.hasNextLine()) {
String key = scanner.findInLine(words);

while (key != null) {
String value = scanner.next();
if (key.equals("CELLID="))
System.out.print("CELLID:" + value+"\n");
//continue with else ifs for other keys
else if (key.equals("ENSUP="))
System.out.print("ENSUP:" + value+"\n");

else if (key.equals("ENCHO="))
System.out.print("ENCHO:" + value+"\n");
key = scanner.findInLine(words);
}
scanner.nextLine();
}

}

真的非常感谢你......

最佳答案

既然你的代码存在性能问题,你首先要找到瓶颈。您可以使用随您使用的 IDE 提供的分析器对其进行分析。

但是,由于您的代码计算量不高,但 IO 密集,无论是使用 System.out.print 读取文件还是输出,这都是我建议您改进的地方,以改进文件 IO。

.

替换这行代码

Scanner scanner = new Scanner(new File("i:\\1\\2.txt"));

.

有了这行代码

File file = new File("i:\\1\\2.txt");
BufferedReader br = new BufferedReader( new FileReader(file) );
Scanner scanner = new Scanner(br);

如果这有帮助,请告诉我们。

.

由于以前的解决方案没有多大帮助,我做了一些更多的更改来改进您的代码。如果有的话,您可能必须更正解析中的错误。我能够在大约 5 秒内显示解析 392832 行的输出。原始解决方案需要 50 多秒。

费用如下:

  1. 使用 StringTokenizer 代替扫描仪
  2. 使用 BufferedReader 读取文件
  3. 使用 StringBuilder 缓冲输出

.

public class FileParse {

private static final int FLUSH_LIMIT = 1024 * 1024;
private static StringBuilder outputBuffer = new StringBuilder(
FLUSH_LIMIT + 1024);
private static final long countCellId;

public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
String fileName = "i:\\1\\2.txt";
File file = new File(fileName);
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ";|, ");
while (st.hasMoreTokens()) {
String token = st.nextToken();
processToken(token);
}
}
flushOutputBuffer();
System.out.println("----------------------------");
System.out.println("CELLID Count: " + countCellId);
long end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
}

private static void processToken(String token) {
if (token.startsWith("CELLID=")) {
String value = getTokenValue(token);
outputBuffer.append("CELLID:").append(value).append("\n");
countCellId++;
} else if (token.startsWith("ENSUP=")) {
String value = getTokenValue(token);
outputBuffer.append("ENSUP:").append(value).append("\n");
} else if (token.startsWith("ENCHO=")) {
String value = getTokenValue(token);
outputBuffer.append("ENCHO:").append(value).append("\n");
}
if (outputBuffer.length() > FLUSH_LIMIT) {
flushOutputBuffer();
}
}

private static String getTokenValue(String token) {
int start = token.indexOf('=') + 1;
int end = token.length();
String value = token.substring(start, end);
return value;
}

private static void flushOutputBuffer() {
System.out.print(outputBuffer);
outputBuffer = new StringBuilder(FLUSH_LIMIT + 1024);
}

}

.

ENSUP 和 MSLH 更新:

在我看来,您似乎已经在 if 语句中切换了 ENSUP 和 MSLH,如下所示。因此,您会看到“ENSUP”的“MSLH”值,反之亦然。

} else if (token.startsWith("MSLH=")) {
String value = getTokenValue(token);
outputBuffer.append("ENSUP:").append(value).append("\n");
} else if (token.startsWith("ENSUP=")) {
String value = getTokenValue(token);
outputBuffer.append("MSLH:").append(value).append("\n");
}

关于java - 我怎样才能以最佳性能进行过滤? (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2083750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com