Java 缓冲 reader 运行 堆外 space
Java Buffered reader running out of heap space
我正在尝试解析一个非常大的文件 (~1.2 GB)。文件的某些行大于允许的最大字符串大小。
FileReader fileReader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while ((line = bufferedReader.readLine()) != null) {
//Do something
}
bufferedReader.close();
错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:569)
at java.lang.StringBuffer.append(StringBuffer.java:369)
at java.io.BufferedReader.readLine(BufferedReader.java:370)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at sax.parser.PrettyPrintXML.format(PrettyPrintXML.java:30)
第 30 行:
while ((line = bufferedReader.readLine()) != null) {
任何人都可以针对这种情况提出任何替代方法。
我相信最大字符串字符长度是 2^31-1 [2,147,483,647] 和 1.2GB 的 txt 文件(假设是一个 txt 文件)可以存储大约 1,200,000,000 个字符。为什么需要读取所有数据?你用它做什么?您能否将文件拆分为多个文件或将其读取并解析为较小的字符串。需要更多信息。
您正在对一个没有行的文件使用 readLine()
。所以它试图将整个文件作为一行来读取。这不会缩放。
解决方案:不要。一次读取一个块,甚至一次读取一个字符:由文件的未说明结构决定的任何内容。
您可以使用 Apache 公共 IO:
https://commons.apache.org/proper/commons-io/description.html
示例:
InputStream in = new URL( "http://commons.apache.org" ).openStream();
try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}
我正在尝试解析一个非常大的文件 (~1.2 GB)。文件的某些行大于允许的最大字符串大小。
FileReader fileReader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while ((line = bufferedReader.readLine()) != null) {
//Do something
}
bufferedReader.close();
错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:569)
at java.lang.StringBuffer.append(StringBuffer.java:369)
at java.io.BufferedReader.readLine(BufferedReader.java:370)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at sax.parser.PrettyPrintXML.format(PrettyPrintXML.java:30)
第 30 行:
while ((line = bufferedReader.readLine()) != null) {
任何人都可以针对这种情况提出任何替代方法。
我相信最大字符串字符长度是 2^31-1 [2,147,483,647] 和 1.2GB 的 txt 文件(假设是一个 txt 文件)可以存储大约 1,200,000,000 个字符。为什么需要读取所有数据?你用它做什么?您能否将文件拆分为多个文件或将其读取并解析为较小的字符串。需要更多信息。
您正在对一个没有行的文件使用 readLine()
。所以它试图将整个文件作为一行来读取。这不会缩放。
解决方案:不要。一次读取一个块,甚至一次读取一个字符:由文件的未说明结构决定的任何内容。
您可以使用 Apache 公共 IO:
https://commons.apache.org/proper/commons-io/description.html
示例:
InputStream in = new URL( "http://commons.apache.org" ).openStream();
try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}