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

Java 解析一个巨大的纯文本文件,java,parsing,file-io,plaintext,Java,Parsing,File Io,Plaintext,我有一个巨大的文本文件(207MB,400万行),我需要逐行按顺序读取它 每行都有以下格式: 20227993821姓名和姓氏NINIC NN08 我(对于常规文件)使用Java库的FileReader和BufferedReader如下所示: FileReader dataFile = new FileReader(directory); data = new BufferedReader(dataFile); String s; while((s = data.readLine()) != n

我有一个巨大的文本文件(207MB,400万行),我需要逐行按顺序读取它
每行都有以下格式:
20227993821姓名和姓氏NINIC NN08

我(对于常规文件)使用Java库的
FileReader
BufferedReader
如下所示:

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处理器。

如果我运行

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);
编辑:如果我打印出每一行,速度会急剧降低,因为写入屏幕需要很长时间。我发现MS-DOS窗口特别慢

Took 0.467 seconds to write and 10.254 second to read a 204.00 MB file.
我不认为读取文件花费的时间太长,而是您正在对其执行的操作花费的时间太长。

如果我运行

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);
编辑:如果我打印出每一行,速度会急剧降低,因为写入屏幕需要很长时间。我发现MS-DOS窗口特别慢

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

我不认为读取文件花费的时间太长,而是您处理文件花费的时间太长。

请定义“处理时间太长”。需要多长时间?你确定时间花在
java.io
上了吗?你能再给我们看看你的“做事”代码吗?你有没有试着一行一行地读文件而不做任何事情?最有可能的是,阅读速度是最快的;是处理过程让你慢下来。我在几秒钟内解析了大约2000万行(大约2 Gig)的行。很可能问题不在java IO中,而是在处理数据时请定义“处理时间过长”。需要多长时间?你确定时间花在
java.io
上了吗?你能再给我们看看你的“做事”代码吗?你有没有试着一行一行地读文件而不做任何事情?最有可能的是,阅读速度是最快的;是处理过程让你慢下来。我在几秒钟内解析了大约2000万行(大约2 Gig)的行。很可能问题不在java IO中,而是在您如何处理数据中。如果将输出重定向到文件,需要多长时间。有些控制台(特别是MS-DOS)速度非常慢。是的,你说得对!MS-DOS控制台会减慢整个过程。我试了试,但没有苏特,工作得很有魅力。谢谢你的帮助!如果将输出重定向到文件,需要多长时间。有些控制台(特别是MS-DOS)速度非常慢。是的,你说得对!MS-DOS控制台会减慢整个过程。我试了试,但没有苏特,工作得很有魅力。谢谢你的帮助!