java - 优化大文件的扫描仪性能

标签 java performance optimization split buffer

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

以下是我迄今为止用来解析输入的每一行的行:

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

然后我有一个循环在调用的行数期间运行:

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

所以我尝试通过以下方式替换扫描仪:

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

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

我的方向是否正确,可以让程序运行得更快?或者问题是否来自使用循环遍历每一行?

最佳答案

我使用以下代码读取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");
  }
}

关于java - 优化大文件的扫描仪性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14349880/

相关文章:

c++ - 在 C++ 中不能内联虚函数总是正确的吗?

java - 存储对 Stream 的引用

java - java中结果集的updateString()方法有什么用处?

Java三元运算符: should check for condition or !条件?

java - 为什么无法解析符号 TransactionWriteRequest 或 TransactionLoadRequest?

html - Dart 中的 Canvas 性能

performance - 是否有库/技术来收集 Prolog 中最佳子句排序的统计信息?

python - 这对 python 中的列表进行冒泡排序最有效吗?

java - 处理 2 - 线程会加速渲染许多对象吗?

c# - 对于具有 +128 位 key 的布隆过滤器,我应该使用什么哈希函数?