Exeption dans Java heap space

ImFaith Messages postés 57 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 17 mars 2015 - 5 déc. 2012 à 11:14
ImFaith Messages postés 57 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 17 mars 2015 - 9 déc. 2012 à 00:49
Slt tout le monde, j'ai une exeption mais je ne sais pas exactement pour quoi ?
Voici le code ci-dessous, il calcule les combinaisons possibles des stratégies des joueurs en exluant un joueur. Chauqe joueur a un ensemble de stratégies.
Le code marche bien pour un nombre réduit de données mais par exemple quand j'ai augmenté le nombre de joueurs à 392, je trouve cette execption. Je ne sais pas est ce que c'est à cause de dépassement de capacité de la pile ou bien de ArrayList ? dites moi; qu'elle est la taille maxiamle d'une pile et aussi de ArrayList, puisque mon projet contient un nombre volumineux de données pas que 392, je veux essayer avec des milliers et dans ce cas, je ne sais pas est ce que ces structures de données sont les meilleurs solutions ou existent d'autre ?


public void CalculStrategiesCombination (Stack <CombinationResult> stack, int index, ArrayList<MemberCoalitions> PlayerCoalitions, int excluded)
 {
   index = index +1;
   if(index != excluded){
   if(index < PlayerCoalitions.size()){  
     for(int j =0; j< PlayerCoalitions.get(index).Coalitions.size(); j++){
 CombinationResult ComRest = new CombinationResult();
 ComRest.Id = index+1;
 ComRest.Strategy = PlayerCoalitions.get(index).Coalitions.get(j);
 Collections.sort(ComRest.Strategy);
 stack.push(ComRest);
 CalculStrategiesCombination (stack, index, PlayerCoalitions, excluded);
 stack.pop();
      }
     }
       else {
   this.Combination.add(new ArrayList<CombinationResult>(stack));	
   }
     }
     else {CalculStrategiesCombination (stack, index, PlayerCoalitions, excluded);}
     }

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Vector.toArray(Unknown Source)
at java.util.ArrayList.(Unknown Source)
at this line : this.Combination.add(new ArrayList<CombinationResult>(stack));	
and this line : CalculStrategiesCombination (stack, index, PlayerCoalitions, excluded);


Qu'elle est la solutions à votre avis. Merci d'avance.

5 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
5 déc. 2012 à 13:56
Salut,

Il y a plusieurs explications possibles, soit un bug qui provoque une boucle infinie avec croissance d'une collection, soit tu as sous-evalué la complexité de ton algorithme.

Tu peux bien sûr augmenter la mémoire allouée à la JVM avec le paramètre de JVM suivant (par exemple 2 Go pour le tas) :

-Xmx2048m

Tu peux aussi jouer avec les structures de données mais ça ne fera pas une grosse différence.

Le mieux pour nous, c'est l'algorithme complet pour qu'on puisse le faire tourner chez nous. Avec ça on verra facilement ce qui ne va pas.
0
ImFaith Messages postés 57 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 17 mars 2015
5 déc. 2012 à 18:31
Salut , donc voici le code complet. J'ai augmenté le mémoire pour le tas à -Xmx1500m ; je ne peux pas plus, puisque j'ai 3 G de Ram. Et en plus maintenant , l'algorithme prend bcp de temps pour afficher l'exeption.

public class MemberCoalitions {
public int Id; // player
public ArrayList> Coalitions = new ArrayList>();
}

public class CombinationResult {
public int Id; // player
public List Strategy; // player's strategy choosen
}

public class Model {
public static  ArrayList<MemberCoalitions> PlayerCoalitions = new  ArrayList<MemberCoalitions>();
public static List> Combination= new ArrayList>();


public void CalculStrategiesCombination (Stack <CombinationResult> stack, int index, ArrayList<MemberCoalitions> PlayerCoalitions, int excluded)
 {
  index = index +1;
  if(index != excluded){
   if(index < PlayerCoalitions.size()){  
    for(int j =0; j< PlayerCoalitions.get(index).Coalitions.size(); j++){
       CombinationResult ComRest = new CombinationResult();
       ComRest.Id = index+1;
       ComRest.Strategy = PlayerCoalitions.get(index).Coalitions.get(j);
       Collections.sort(ComRest.Strategy);
       stack.push(ComRest);
       CalculStrategiesCombination (stack, index, PlayerCoalitions, excluded);
       stack.pop();
      }
    }
   else {
      this.Combination.add(new ArrayList<CombinationResult>(stack));	
      }
 }
else {CalculStrategiesCombination (stack, index, PlayerCoalitions, excluded);}
}

public static void main(String[] args) throws Exception {
Model Mod = new Model ();
// inserer les joueurs
  for(int i =0; i < 392; i++){
    MemberCoalitions Mc= new MemberCoalitions(); 
    Mc.Id = i+1; // insert player
    Mod.PlayerCoalitions.add(Mc);
  }
  // les stratégies ici, sont les membres d'equipe dont il Appaertient le joueur  conerné
//(c'est une simulation, j'ai pas encore implémenté la procédure, mon prof m'a demandé de faire comme ça pour l'instant)	
 // 2 équipes 
 for(int i =0; i < 392; i++){
    if(i < 392 /2){
     ArrayList Coalition = new ArrayList();
     for(int j =0; j < 392/2; j++){
 Coalition.add(j+1);
     }
     Mod.PlayerCoalitions.get(i).Coalitions.add(Coalition);
    }
    else {
     ArrayList Coalition = new ArrayList();
     for(int j =392/2; j < 392; j++){
      Coalition.add(j+1);
     }
    Mod.PlayerCoalitions.get(i).Coalitions.add(Coalition);
    }
  }

 // 3 équipes
  for(int i =0; i < 392; i++){
   if(i <= 130){   // 392/3
     ArrayList Coalition = new ArrayList();
     for(int j =0; j < 392/2; j++){
     Coalition.add(j+1);
    }
   Mod.PlayerCoalitions.get(i).Coalitions.add(Coalition);
   }
   else if(i < 260 && i > 130){
    ArrayList Coalition = new ArrayList();
    for(int j =130; j < 260; j++){
    Coalition.add(j+1);
    }				      
   Mod.PlayerCoalitions.get(i).Coalitions.add(Coalition);
  }
 else {
  ArrayList Coalition = new ArrayList();
  for(int j = 260; j < 392; j++){
  Coalition.add(j+1);
  }						  
  Mod.PlayerCoalitions.get(i).Coalitions.add(Coalition);
  }
 }
 for(int i =0; i < Mod.PlayerCoalitions.size(); i++){
  Stack <CombinationResult> stack = new Stack <CombinationResult>();
  Mod.Combination= new ArrayList>();
  Mod.CalculStrategiesCombination(stack, -1, Mod.PlayerCoalitions, i);
  }

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Vector.toArray(Unknown Source)
at java.util.ArrayList.(Unknown Source)
at this line : this.Combination.add(new ArrayList<CombinationResult (stack));	
        and this line : CalculStrategiesCombination (stack, index, PlayerCoalitions, excluded);


Merci d'avance.
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
6 déc. 2012 à 10:39
Ok merci.

Moi je trouve que 392 avec 2 répartitions possibles, c'est déjà énorme.
Si j'ai bien compris, pour chaque joueur, tu as 2 coalitions possibles.

Joueur 1 : coalition 1 à 196 OU coalition 1 à 131
...
Joueur 392 : coalition 197 à 392 OU coalition 261 à 392

Au final, tu peux faire 2^392 combinaisons possibles :
Ce n'est pas raisonnable, tu n'auras jamais assez de mémoire ou de temps !

Pour te donner un ordre de grandeur :
< 2^10 : instantané
< 2^20 : rapide
< 2^30 : lent
< 2^40 : très lent
< 2^50 : à la rigueur sur un supercalculateur

Peut-être as-tu mal compris ce que ton professeur t'as demandé ?
Quel est l'énoncé du problème ?
0
ImFaith Messages postés 57 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 17 mars 2015
8 déc. 2012 à 18:53
Bonjour,
Désolé pour le retard et merci pour la réponse. Que je t'ai donné c'est juste un exemple. J'ai pas besoin que deux coalitions pour chaque joueurs, moi j'ai besoins plus que deux. C'est exactement qui est demandé. Je pense que dans ce cas, je suis obligé d'utiliser les fichiers, par exemple un fichier XML, vu le nombre énorme de données. Je veux savoir; est ce que ça est la meilleur solution ? et est ce que je perdrai encore plus de temps ? si jamais j'augmente la taille de la RAM, est ce que je peux résoudre le probléme ?

En tout cas, j'ai essayé d'enregistrer les résultats dans un fichier xml, mais le résulat n'est comme je veux !.
public class MemberCoalitions {
public int Id; // player
public ArrayList> Coalitions = new ArrayList>();

public class TEST {

public void CalculStrategiesCombination ( Document doc, Node Combinations,  Stack <Element> stack, int index, ArrayList<MemberCoalitions> PlayerCoalitions, int excluded) {
index = index +1;
        if(index != excluded){
if(index < PlayerCoalitions.size()){  
for(int j =0; j< PlayerCoalitions.get(index).Coalitions.size(); j++){
    Element Strategy = doc.createElement("Strategy");		      Strategy.appendChild(doc.createTextNode(String.valueOf(PlayerCoalitions.get(index).Coalitions.get(j))));
    Attr attr = doc.createAttribute("id");
    attr.setValue(String.valueOf(index+1));
    Strategy.setAttributeNode(attr);
    stack.push(Strategy);
    CalculStrategiesCombination (doc,Combinations, stack, index, 
            PlayerCoalitions, excluded);
    stack.pop();
   }
}
else {
       Element Combination = doc.createElement("Combination");
       for(int i =0; i< stack.size(); i++){
Combination.appendChild(stack.get(i));  
       }
       Combinations.appendChild(Combination);		
      }
     }
else {CalculStrategiesCombination (doc, Combinations, stack, index, PlayerCoalitions, excluded);}
}



 public static void main(String argv[]) throws Exception, IOException {
 
public static void main(String argv[]) throws Exception, IOException {
 
 ArrayList<MemberCoalitions> PlayerCoalitions = new  ArrayList<MemberCoalitions>();
  MemberCoalitions m = new MemberCoalitions();
  m.Id = 1;
  ArrayList li= new ArrayList();
  li.add(1);
  m.Coalitions.add(li);
  ArrayList lz= new ArrayList();
  lz.add(1);
  lz.add(2);
  m.Coalitions.add(lz);
  lz= new ArrayList();
  lz.add(1);
  lz.add(2);
  lz.add(3);
  m.Coalitions.add(lz);
  PlayerCoalitions.add(m);
   m = new MemberCoalitions();
  m.Id = 2;
  li= new ArrayList();
  li.add(2);
  m.Coalitions.add(li);
   lz= new ArrayList();
   lz.add(1);
  lz.add(2);
  lz.add(3);
  m.Coalitions.add(lz);
  lz= new ArrayList();
  lz.add(2);
  lz.add(3);
  m.Coalitions.add(lz);
  PlayerCoalitions.add(m);
  m = new MemberCoalitions();
  m.Id = 3;
  li= new ArrayList();
  li.add(3);
  m.Coalitions.add(li);
  lz= new ArrayList();
  lz.add(1);
  lz.add(2);
  lz.add(3);
  m.Coalitions.add(lz);
  lz= new ArrayList();
  lz.add(2);
  lz.add(3);
  m.Coalitions.add(lz);
  PlayerCoalitions.add(m);
  TEST t = new TEST();
 try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
 
// root elements
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Matrices");
doc.appendChild(rootElement);
       Element Player = doc.createElement("Matrix");
rootElement.appendChild(Player);
       Attr attr = doc.createAttribute("id");
attr.setValue("1");
Player.setAttributeNode(attr);
Element Combinationss = doc.createElement("Combinations");
Player.appendChild(Combinationss);
       // write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("D:\\file1.xml"));
transformer.transform(source, result);

      // modification
        
      String filepath = "D:\\file1.xml";
      DocumentBuilderFactory docFactory1 = DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder1 = docFactory1.newDocumentBuilder();
      Document doc1 = docBuilder1.parse(filepath);
      // Get the root element
      Node Combinations =  doc1.getElementsByTagName("Combinations").item(0);
      Stack <Element> stack = new Stack <Element>();
      t.CalculStrategiesCombination(doc1,Combinations, stack, -1, PlayerCoalitions, 0);

     //write the content into xml file
     TransformerFactory transformerFactory1 = TransformerFactory.newInstance();
     Transformer transformer1 = transformerFactory1.newTransformer();
     DOMSource source1 = new DOMSource(doc1);
     StreamResult result1 = new StreamResult(new File(filepath));
     transformer1.transform(source1, result1);
     } catch (ParserConfigurationException pce) {
       pce.printStackTrace();
     }
  }
}



Moi je veux le résultat comme suit :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Matrices>
<Matrix>
<Combinations>
<Combination>
<Strategy id="2">[2]</Strategy>
<Strategy id="3">[3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[2]</Strategy>
<Strategy id="3">[1,2,3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[2]</Strategy>
<Strategy id="3">[2,3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[1,2,3]</Strategy>
<Strategy id="3">[3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[1,2,3]</Strategy>
<Strategy id="3">[1,2,3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[1,2,3]</Strategy>
<Strategy id="3">[2,3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[2,3]</Strategy>
<Strategy id="3">[3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[2,3]</Strategy>
<Strategy id="3">[1,2,3]</Strategy>
</Combination>
<Combination>
<Strategy id="2">[2,3]</Strategy>
<Strategy id="3">[2,3]</Strategy>
</Combination>
</Combinations>
</Matrix>
</Matrices>


Moi j'obtient le résultat suivant :
  <?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
- <Matrices>
- <Matrix>
- <Combinations>
- <Combination>
  <Strategy id="3">[3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="3">[1, 2, 3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="2">[2]</Strategy> 
  <Strategy id="3">[2, 3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="3">[3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="3">[1, 2, 3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="2">[1, 2, 3]</Strategy> 
  <Strategy id="3">[2, 3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="3">[3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="3">[1, 2, 3]</Strategy> 
  </Combination>
- <Combination>
  <Strategy id="2">[2, 3]</Strategy> 
  <Strategy id="3">[2, 3]</Strategy> 
  </Combination>
  </Combinations>
  </Matrix>
  </Matrices>

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ImFaith Messages postés 57 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 17 mars 2015
9 déc. 2012 à 00:49
SLT;
j'ai réussi à obtenir le résulat, mais le probléme c'est que pour 392 données, j'obtient un fichier xml de taille trés importante; 68 MO.
Je ne sais pas est ce qu'il existe d'autre solution pour regler ce probléme. Je veux utiliser des milliers de données, alors la taille dufichier Xml sera trop importante, et je vais perdre le temps dans le parsing du fichier Xml ?
merci d'avance.
0
Rejoignez-nous