【发布时间】:2021-01-15 08:00:54
【问题描述】:
我有以下代码用于读取大约 300MB 大小的文件,执行被“java.lang.OutOfMemoryError: Java heap space”异常中断:
import java.io.*;
import java.util.*;
class MainClass {
static ArrayList<String> getAttribute(String str) {
if(str==null) return null;
ArrayList<String> a = new ArrayList<>();
int i = 0;
int j = -1;
while(i<str.length() && j<str.length()) {
j = str.indexOf(',',i);
if(j==-1) j = str.length();
a.add(str.substring(i,j));
i = str.indexOf(',',j)+1;
}
return a;
}
static ArrayList<ArrayList<String>> readFile(String in) throws IOException {
ArrayList<ArrayList<String>> a = new ArrayList<>();
try(FileInputStream fin = new FileInputStream(in);) {
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
String str = br.readLine();
while(str!=null) {
a.add(getAttribute(str));
str = br.readLine(); //line 26
}
}
return a;
}
public static void main(String args[]) throws IOException
{
readFile("stats1.csv"); //line 34
}
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at MainClass.readFile(MainClass.java:26)
at MainClass.main(MainClass.java:34)
这个错误的原因是什么?还是只是文件太大?
【问题讨论】:
-
你能添加完整的堆栈跟踪吗?哪条线路会导致问题?
-
@flaxel 好的,我更新了 stracktrace 和行号。
-
嗯,你正在读取内存中的整个文件,这最终会爆炸。而是逐行加载和解析文件。它可能会更快,文件大小突然不再重要了。
-
"这个错误的原因是什么?还是只是文件太大了?"那么,你能用一个小文件重现错误吗?
-
@M.Deinum 感谢您的回复。我实际上被要求这样做,将整个文件复制到一个二维 ArrayList 中。
标签: java