java – 从大文件中提取模式的更多性能方法(超过700MB)
作者:互联网
我有一个问题,需要我从本地机器解析一个文本文件.有一些并发症:
>文件可能很大(700mb)
>模式出现在多行中
>我需要在模式之后存储行信息
我使用BufferReader,String.indexOf和String.substring(获取第3项)创建了一个简单的代码.
在文件内部,它有一个名为code =的密钥(模式),它在不同的块中多次出现.程序使用BufferReader.readLine从该文件中读取每一行.它使用indexOf检查模式是否出现,然后在模式之后提取文本并存储在公共字符串中.
当我用600mb文件运行我的程序时,我发现在处理文件时性能最差.我在CodeRanch中读到一篇文章,认为Scanner类不适用于大文件.
是否有某些技术或库可以提高我的表现?
提前致谢.
这是我的源代码:
String codeC = "code=[";
String source = "";
try {
FileInputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
DataInputStream in = new DataInputStream(f1);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
boolean bPrnt = false;
int ln = 0;
// Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
if (strLine.indexOf(codeC) != -1) {
ln++;
System.out.println(strLine + " ---- register : " + ln);
strLine = strLine.substring(codeC.length(), strLine.length());
source = source + "\n" + strLine;
}
}
System.out.println("");
System.out.println("Lines :" + ln);
f1.close();
} catch ( ... ) {
...
}
解决方法:
您的此代码非常可疑,可能至少会导致您的性能问题的一部分:
FileInputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
DataInputStream in = new DataInputStream(f1);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
您没有充分理由涉及DataInputStream,实际上将其用作Reader的输入可以被视为代码损坏的情况.写这个:
InputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fr));
对性能的巨大损害是您正在使用的System.out,特别是如果您在Eclipse中运行时测量性能,但即使从命令行运行也是如此.我的猜测是,这是造成瓶颈的主要原因.无论如何,确保在瞄准最佳性能时不要在主循环中打印任何内容.
标签:java,parsing,large-files,performance 来源: https://codeday.me/bug/20190629/1330277.html