2010-10-19 2 views
0

Я получаю java.lang.OutOfMemoryError: превышение лимита GC превысило ошибку при чтении из текстового файла. Я не уверен, что происходит неправильно. Я запускаю свою программу на кластер, имеющий достаточную память. Внешний цикл повторяется в 16000 раз, и для каждой итерации внешнего цикла внутренний цикл повторяется примерно 300 000 раз. Ошибка вызывается, когда код пытается прочитать строку из внутреннего цикла. Ниже приводится мой фрагмент кода:Ограничение верхнего предела ОВП превысило ошибку при чтении текстового файла

//Read from the test data output file till not equals null 
//Reads a single line at a time from the test data 
while((line=br.readLine())!=null) 
{ 
    //Clears the hashmap 
    leastFive.clear(); 

    //Clears the arraylist 
    fiveTrainURLs.clear(); 
    try 
    { 
     StringTokenizer st=new StringTokenizer(line," "); 
     while(st.hasMoreTokens()) 
     { 
      String currentToken=st.nextToken(); 

      if(currentToken.contains("File")) 
      { 
       testDataFileNo=st.nextToken(); 
       String tok=""; 
       while((tok=st.nextToken())!=null) 
       { 
        if (tok==null) break; 

        int topic_no=Integer.parseInt(tok); 
        topic_no=Integer.parseInt(tok); 
        String prob=st.nextToken(); 

        //Obtains the double value of the probability 
        double double_prob=Double.parseDouble(prob); 
        p1[topic_no]=double_prob; 

       } 
       break; 
      } 
     } 
    } 
    catch(Exception e) 
    { 
    } 

    //Used to read over all the training data file 
    FileReader fr1=new FileReader("/homes/output_train_2000.txt"); 

    BufferedReader br1=new BufferedReader(fr1); 
    String line1=""; 

    //Reads the training data output file,one row at a time 
    //This is the line on which an exception occurs! 
    while((line1=br1.readLine())!=null) 
    { 
     try 
     { 
      StringTokenizer st=new StringTokenizer(line1," "); 

      while(st.hasMoreTokens()) 
      { 
       String currentToken=st.nextToken(); 

       if(currentToken.contains("File")) 
       { 
        trainDataFileNo=st.nextToken(); 
        String tok=""; 
        while((tok=st.nextToken())!=null) 
        { 
         if(tok==null) 
          break; 

         int topic_no=Integer.parseInt(tok); 
         topic_no=Integer.parseInt(tok); 
         String prob=st.nextToken(); 

         double double_prob=Double.parseDouble(prob); 

         //p2 will contain the probability values of each of the topics based on the indices 
         p2[topic_no]=double_prob; 

        } 
        break; 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      double result=klDivergence(p1,p2); 

      leastFive.put(trainDataFileNo,result); 
     } 
    } 
} 

ответ

3

16000 * 300000 = 4,8 МЛРД. Если каждый токен занимает всего 6 байтов, это само по себе превышает 24 ГБ. Сборщик мусора будет работать в течение долгого времени, когда он, наконец, начнет работать в gc с 24 ГБ. Похоже, вам нужно разбить это на более мелкие куски. Вы можете ограничить память приложения до чего-то разумного, например, 1 ГБ, чтобы GC успел вскочить раньше и может что-то сделать за время, когда он должен выполнить свою работу.

+0

Плюс, я считаю, что окна игнорируют максимальные размеры vm более 1,2 ГБ. – Noah

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