解析一个巨大的纯文本文件

时间:2012-01-31 12:23:37

标签: java parsing file-io plaintext

我有一个巨大的文本文件(207 MB,400万行),我需要逐行读取它。
每一行都有这种格式:
20227993821NAME AND SURNAME NINIC NN08
我正在使用(对于常规文件)Java库的FileReaderBufferedReader,如下所示:

FileReader dataFile = new FileReader(directory);
data = new BufferedReader(dataFile);
String s;
while((s = data.readLine()) != null){
    //do stuff
}

没有任何问题,但是使用大文件需要花费太多时间来处理 我想知道在这种情况下最好的做法是什么(另一个图书馆,不同的方法等),任何事情都会有所帮助 该文件由政府机构定期发布,必须加载到我的软件中进行数据比较。

编辑:

此代码:

BufferedReader data = new BufferedReader(new FileReader(file));
String s;
int count = 0;
while ((s = data.readLine()) != null) {
   System.out.println (count + " - " + s);
   count++;
}
data.close();

在19分30秒内完成。我不知道为什么花这么长时间。我有一个64位操作系统和一个i5处理器。

1 个答案:

答案 0 :(得分:7)

如果我跑

File file = new File("/tmp/deleteme.txt");
file.deleteOnExit();

long start = System.nanoTime();
PrintWriter pw = new PrintWriter(file);
for (int i = 0; i < 4 * 1000 * 1000; i++)
    pw.println("01234567890123456789012345678901234567890123456789");
pw.close();

long mid = System.nanoTime();
BufferedReader data = new BufferedReader(new FileReader(file));
String s;
while ((s = data.readLine()) != null) {
    //do stuff
}
data.close();
long end = System.nanoTime();

System.out.printf("Took %.3f seconds to write and %.3f seconds to read a %.2f MB file.%n",
        (mid - start) / 1e9, (end - mid) / 1e9, file.length() / 1e6);

打印

Took 0.465 seconds to write and 0.522 seconds to read a 204.00 MB file.

编辑:如果我打印出每一行,它会大大减慢,因为写入屏幕需要很长时间。我发现MS-DOS窗口特别慢。

Took 0.467 seconds to write and 10.254 second to read a 204.00 MB file.

我不相信它的文件读取时间太长,这是你用它做的事情需要很长时间。