2010-10-19 14 views
0

Je reçois java.lang.OutOfMemoryError: la limite de surcharge GC a dépassé l'erreur lors de la lecture d'un fichier texte.Je ne suis pas sûr de ce qui ne va pas.J'exécute mon programme sur un La boucle externe itère pendant 16 000 fois et pour chaque itération de la boucle externe, la boucle interne itère environ 300 000 fois. L'erreur est renvoyée lorsque le code tente de lire une ligne de la boucle interne. Ce qui suit est mon extrait de code: Ce qui suit est mon extrait de code:GC Limite de dépassement de capacité dépassée lors de la lecture d'un fichier texte

//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); 
     } 
    } 
} 

Répondre

3

16000 * 300000 = 4,8 MILLIARDS. Si chaque jeton ne prend que 6 octets, cela dépasse 24 Go. Le garbage collector fonctionnera longtemps quand il débutera finalement en gc avec 24Go. On dirait que vous avez besoin de briser cela en plus petits morceaux. Vous pouvez limiter la mémoire de votre application à quelque chose de raisonnable, comme 1 Go, afin que le GC entre plus tôt et puisse faire quelque chose dans le temps qu'il doit faire son travail.

+0

De plus, je crois que Windows ignore les limites de taille max vm supérieur à 1,2 Go. – Noah