打印行、Java堆空间

打印行、Java堆空间,java,exception,readline,out-of-memory,Java,Exception,Readline,Out Of Memory,我想打印一个巨大的文本文件(超过60万MB)中的每一行 但是,当我尝试下面的代码时,在到达第1000000行之前,我得到“…OutOfMemoryError:Java堆空间” 有没有比FileReader和LineNumberReader更好的方法来处理输入 FileReader fReader = new FileReader(new File("C:/huge_file.txt")); LineNumberReader lnReader = new LineNumberReader(fRea

我想打印一个巨大的文本文件(超过60万MB)中的每一行

但是,当我尝试下面的代码时,在到达第1000000行之前,我得到“…OutOfMemoryError:Java堆空间”

有没有比FileReader和LineNumberReader更好的方法来处理输入

FileReader fReader = new FileReader(new File("C:/huge_file.txt"));
LineNumberReader lnReader = new LineNumberReader(fReader);
String line = "";
while ((line = lnReader.readLine()) != null) {
    System.out.println(lnReader.getLineNumber() + ": " + line);
}
fReader.close();
lnReader.close();
提前谢谢


谢谢大家的回答


我最终发现了内存泄漏,这是一个未使用的java类实例,它在每一行迭代中都复制了内存泄漏。换句话说,它与文件加载部分无关。

也许您应该尝试设置Java虚拟机的最大堆大小? 或查看此链接:


LineNumberReader
扩展
BufferedReader
。可能是缓冲读取器缓冲过多。通过分析器运行程序应该可以毫无疑问地证明这一点

BufferedReader
的一个构造函数采用缓冲区大小,行号读取器中也提供此构造函数

替换:

LineNumberReader lnReader = new LineNumberReader(fReader);
与:


使用此类读取文件:这样您就不会再有内存不足的问题了

您的代码不会产生OutOfMemoryError,您对数据所做的操作更有可能是问题的原因。对于这么大的文本文件,有没有可能你只是有一个非常大的行在那里?同时管理一个600 GB的文本文件将是缓慢和繁琐的。你应该考虑使用较小的文本文件。正如SpaceCowboy所建议的,你需要大约5倍的空闲内存中最长的行。尝试
System.out.print(lnReader.getLineNumber()+“:”);系统输出打印项次(行)避免创建第二个StringBuilder/字符串,其中包含整行内容和更多内容。@heykarlm,FileReader不使用太多内存,LineNumberReader使用恒定的内存量(~16KB,即使未使用)。使用的唯一可变内存量是读取的行和为输出生成的字符串。
LineNumberReader lnReader = new LineNumberReader(fReader, 4096);