Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petit problème ...

out of memory

5 mai 2012 à 18:57:44

Salut tous les zéros !!

J'ai un petit problème de java :

public class sdz1 
{

	
	public static void main(String[] args) 
	{
		int Fibonnaci[] = new int [400000000];
		int i = 2; long r = 3;
		Fibonnaci[0] = 0;
		Fibonnaci[1] = 1;
		
		while(Fibonnaci[i] < 4000000)
		{
			Fibonnaci[i] = Fibonnaci[i-1] + Fibonnaci[i-2];
			r = r + Fibonnaci[i];
			i++;
		}
	System.out.println(" "+r+ " ");
	System.out.println("bonjour");
	
	}
	
}


Seulement quand je lance ça donne :
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at sdz1.main(sdz1.java:7)

que faire ?
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2012 à 22:01:29

Diminuer la taille du tableau :p

Pourquoi vouloir faire un tableau de 400 millions de cases ?
  • Partager sur Facebook
  • Partager sur Twitter
⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
5 mai 2012 à 22:31:13

car je dois calculer la somme des éléments de la suite de Fibonacci tant que Fn <= 4 000 000 mais je ne sais absolument pas quelle place cela peut prendre ..
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2012 à 23:02:47

Salut ant0421,
Pour augmenter la mémoire maximum allouée au process java on peut utiliser l'option "Xmx" sur la commande java qui lance le programme.
Mais bon là avec 400000000 int ça doit faire dans les 1.5 Go faudrait mieux éviter ^^.
Ici au lieu d'utiliser un tableau de taille prédéfinie, il faudrait mieux utiliser une List.
Et puis si on connait un minimum la suite de Fibonnaci on sait qu'il faudra beaucoup moins d'éléments puisque plus x est grand, plus Fibonnaci(x) est supérieur à x. Je pense qu'un tableau de 100 éléments est amplement suffisant.
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2012 à 23:15:17

alors petite modification, c'est uniquement les nombres pairs. Voici mon code :

public class sdz1 
{

	
	public static void main(String[] args) 
	{
		long Fibonnaci[] = new long [100000];
		int i = 2; long test = 0, r = 0;
		Fibonnaci[0] = 0;
		Fibonnaci[1] = 1;
		
		while(Fibonnaci[i] <= 4000000)
		{
			Fibonnaci[i] = Fibonnaci[i-1] + Fibonnaci[i-2];
			test = Fibonnaci[i] % 2;
			if(test == 0)
			{
				r = r + Fibonnaci[i];
			}
			i++;
		}
	System.out.println(" "+r+ " ");
	System.out.println("bonjour");
	
	}
	
}


et l'erreur :

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100000
at sdz1.main(sdz1.java:12)
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2012 à 23:52:12

Ça veut dire qu'aucune case de ton tableau ne contient de valeur supérieure à 4 millions. Tant que cette condition n'est pas respectée il continue à boucler indéfiniment le problème est que ton tableau n'a que 100.000 cases numérotées de 0 à 99.999 donc arrivé à la case numéro 100.000 le programme plante puisqu'elle n'existe pas dans ton tableau.
  • Partager sur Facebook
  • Partager sur Twitter
⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
6 mai 2012 à 0:07:47

le problème c'est que si je mets 10 000 000 pour le nombre de cases, il me renvoie la même erreur ...
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 mai 2012 à 9:00:25

Ta condition est toujours vérifiée car tu testes Fibonacci[i] avant qu'il soit calculé... Mets Fibonacci[i-1] < 40000000 ou fait une boucle do {...} while :)

De plus, si tu as seulement besoin de r, inutile de faire un tableau, tu peux faire la même chose avec trois variables seulement.

while (fi1 < valeur) {
      fi = fi1 + fi2
      ajout dans r
      fi2 = fi1
      fi1 = fi
}
  • Partager sur Facebook
  • Partager sur Twitter