У меня есть большой файл txt с целыми числами в нем. Каждая строка в файле имеет два целых числа, разделенных пробелами. Размер файла - 63 Мб.Java outOfMemory exception в string.split
Pattern p = Pattern.compile("\\s");
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
String[] tokens = p.split(line);
String s1 = new String(tokens[0]);
String s2 = new String(tokens[1]);
int startLabel = Integer.valueOf(s1) - 1;
int endLabel = Integer.valueOf(s2) - 1;
Vertex fromV = vertices.get(startLabel);
Vertex toV = vertices.get(endLabel);
Edge edge = new Edge(fromV, toV);
fromV.addEdge(edge);
toV.addEdge(edge);
edges.add(edge);
System.out.println("Edge from " + fromV.getLabel() + " to " + toV.getLabel());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:2694)
at java.lang.String.<init>(String.java:203)
at java.lang.String.substring(String.java:1913)
at java.lang.String.subSequence(String.java:1946)
at java.util.regex.Pattern.split(Pattern.java:1202)
at java.util.regex.Pattern.split(Pattern.java:1259)
at SCC.main(SCC.java:25)
Почему я получаю это исключение? Как я могу изменить свой код, чтобы избежать его?
EDIT: Я уже увеличил размер кучи до 2048 м. Что его поглощает? Это то, что я хотел бы знать также.
Для всего, что я знаю, jvm должен выделять память на список вершин, набор ребер, буфер для буферизованного считывателя и одну маленькую строку «строка». Я не вижу, откуда эта outOfMemory.
Я прочитал о методе string.split(). Я думаю, что это вызывает утечку памяти, но я не знаю, что мне делать с этим.
Я думаю 'p.split (строка);' должен быть 'line.split (" \\ s + ");' – Smit
@Smit Нет, это попытается разбить строку "\ s +" на шаблон '\ s'. – erickson
@erickson это wouldnt. Посмотрите на метод String.split() в API. Хотя Pattern.split() должен вести себя точно так же, так что вы действительно ошибаетесь ... – gnomed