2017-02-09 3 views
0

У меня есть текстовый файл размером около 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) 
+0

Не читайте целые файлы в памяти. Обработайте их по очереди за раз. Если вы не можете, что-то не так с дизайном файла, или вы должны использовать базу данных. – EJP

+0

@EJP Как это сделать? – ak0817

+0

Почему бы не написать свой вывод в новый файл? Вы могли бы даже написать его как JSON, который фактически является картой. – ayahuasca

ответ

-1

и должны добавить условие цикла. повторите попытку с подчеркиванием code.it, похоже, работает!

try { 
     String line; 

     while ((line = reader.readLine()) != null) { 
      String text = line.substring(0, line.lastIndexOf(",")).trim(); 

      String id = line.substring(line.lastIndexOf(",") + 1).trim(); 

      //put this in a hashmap and other processing 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      reader.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

Обновлен код. Спасибо, но проблема в другом. – ak0817

+0

может описать проблему просто или вставить что-то –

+0

скрининг на скриншот ошибки. – ak0817

Смежные вопросы