4

我有一个问题,需要我从本地机器解析一个文本文件。有一些并发症:

  1. 文件可能非常大(700mb+)
  2. 该模式出现在多行中
  3. 我需要在模式之后存储行信息

我使用BufferReader,String.indexOfString.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 ( ... ) {
    ...
}
4

4 回答 4

2

您的这段代码非常可疑,并且很可能至少可以解释您的部分性能问题:

FileInputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
DataInputStream in = new DataInputStream(f1);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

DataInputStream无缘无故地参与其中,实际上将其用作 a 的输入Reader可以被认为是代码损坏的情况。改为这样写:

InputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fr));

对性能的巨大损害是System.out您正在使用,特别是如果您在 Eclipse 中运行时测量性能,但即使从命令行运行也是如此。我的猜测是,这是造成瓶颈的主要原因。当您以最佳性能为目标时,请务必确保不在主循环中打印任何内容。

于 2012-11-29T19:27:22.000 回答
1

除了 Marko 的回答,我建议关闭 br,而不是 f1:

br.close()

这不会影响性能,但更清洁。(关闭最外面的流)

于 2012-11-29T19:34:33.753 回答
0

看看java.util.regex

来自 oracle的优秀教程。

来自 JAVADoc 的复制粘贴:

用于将字符序列与正则表达式指定的模式匹配的类。

Pattern 类的一个实例表示一个以字符串形式指定的正则表达式,其语法类似于 Perl 使用的语法。

Matcher 类的实例用于将字符序列与给定模式匹配。通过 CharSequence 接口向匹配器提供输入,以支持匹配来自各种输入源的字符。

除非另有说明,否则将 null 参数传递给此包中任何类或接口中的方法将导致抛出 NullPointerException。

于 2012-11-29T19:12:43.010 回答
0

它完美地工作!

我听从了 OldCurmudgeonMarko TopolnikAlexWien 的建议,我的表现提高了 1000%。之前程序花了 2 个小时完成所描述的操作并在文件中写入响应。现在它花了5分钟!并且 SYSO 保留在源代码中!

我认为巨大改进的原因是像 OldCurmudgeon 所建议的那样为 HashSet“源”更改字符串“源”。Bur 我删除了 DataInputStream 并使用了“br.close”。

多谢你们 !!

于 2012-11-29T20:29:15.407 回答