优化大型文件的扫描仪性能

时间:2013-01-16 01:09:05

标签: java performance optimization split buffer

我使用Scanner在Java中编写了一个程序,以便从每行中用空格分隔两个元素,将它放在ArrayList中的对象中。它工作得很好,但是当涉及到10000行的输入时,它变得非常长。我阅读了一些主题和网站(例如this),告诉BufferedReaderScanner更有效率,但我在尝试时没有看到任何改进。

以下是我目前用来解析输入的每一行的行:

  String charsetName = "UTF-8";
  Scanner scanner = new Scanner(new BufferedInputStream(System.in), charsetName);

然后我在调用行数期间运行循环:

 String[] mid = scanner.nextLine().split(" ");

所以我尝试将Scanner替换为:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] base = reader.readLine().split(" ");

它没有改变任何东西(两种情况下12000行都是8秒)

我是否朝着正确的方向努力让程序更快地运作?或者问题来自于使用循环来遍历每一行?

1 个答案:

答案 0 :(得分:2)

我使用以下代码来读取 280,000行的文件(每行由空格分隔两个单词)并将它们拆分为空格。 耗时0.105秒。所以我想更多地了解您正在解析的行以及您正在使用它做什么。请粘贴更多代码。

  public static void main(String args[]) throws Exception {

    Date start = new Date();

    BufferedReader b = new BufferedReader(new FileReader("aa.txt"));
    String line;
    while ((line = b.readLine())!=null) {
      String[] splat = line.split(" ");
    }
    b.close();

    Date end = new Date();
    System.out.println("Took " + (end.getTime() - start.getTime()) / 1000.0 + " seconds");
  }

我修改了上面的代码,将每个splat数组添加到数组列表中(不知道为什么要这样做,但我猜这是你想要做的,从你的OP)。代码减慢到0.244秒。还是不到一秒钟。更多信息请。

补充 - 完整代码(使用javac Julien.java编译)。 请记住将aa.txt替换为您的文件名。

import java.util.*;
import java.io.*;

public class Julien {

  public static void main(String args[]) throws Exception {

    Date start = new Date();
//    List arrl = new ArrayList();
    BufferedReader b = new BufferedReader(new FileReader("aa.txt"));
    String line;
    while ((line = b.readLine())!=null) {
      String[] splat = line.split(" ");
//      arrl.add(splat);
    }
    b.close();
    Date end = new Date();
    System.out.println("Took " + (end.getTime() - start.getTime()) / 1000.0 + " seconds");
  }
}