У меня есть текстовый файл размером около 2 ГБ. Каждая строка файла имеет следующий формат:java.lang.OutOfMemoryError: превышение верхнего предела GC при чтении большого текстового файла
некоторый текст, возможно, через запятую, уникальное целое число
мне нужно взять каждую строку, разделить его на две части: текста, уникальное целое и поместить его в Hashmap в качестве пары ключевых значений.
Теперь я столкнулся с OutOfMemory Ошибка, даже если размер кучи установлен на 10 ГБ.
Для этого могут быть две причины: 1. Способ чтения файла неправильный. 2. Я создаю слишком много ненужных объектов String.
Это то, что я делаю:
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.txt");
InputStreamReader stream = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(stream);
while(true)
{
line =reader.readLine();
if (line == null) {
break;
}
String text= line.substring(0, line.lastIndexOf(",")).trim();
String id = line.substring(line.lastIndexOf(",") + 1).trim();
//put this in a hashmap and other processing
}
Поскольку мне нужно разделить каждую строку текста в двух частях и первая часть (текст) может иметь запятые, а я использую подстроку() метод для этой цели.
Причина, по которой я использую обрезку, заключается в том, что мне нужно поместить текст и идентификатор в Hashmap без конечных и ведущих пробелов.
Сообщение об ошибке:
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:207)
at java.lang.String.substring(String.java:1969)
Не читайте целые файлы в памяти. Обработайте их по очереди за раз. Если вы не можете, что-то не так с дизайном файла, или вы должны использовать базу данных. – EJP
@EJP Как это сделать? – ak0817
Почему бы не написать свой вывод в новый файл? Вы могли бы даже написать его как JSON, который фактически является картой. – ayahuasca