2010-08-16 10 views
2

J'utilise cette déclarationOutOfMemory Erreur espace de tas java

//some code 
int a[][]=new int[5000000][5000000]; 
//some code 

et en cours d'exécution avec commande

java -mx512m Test 

Il donne OutOfMemoryError: espace Java Heap indiquant le numéro de ligne de la déclaration mentionnée dans le stacktrace

Comment puis-je résoudre ce problème

Edit: J'essaie de résoudre un practice problem on codechef

+1

Qu'est-ce que vous voulez réellement atteindre avec une matrice de 25 trillions d'octets? – sinuhepop

+3

Bon Dieu, avez-vous vraiment pensé que vous pouviez allouer, et parcourir 100 To de données dans les 3 secondes que votre algorithme est autorisé à prendre? – meriton

+0

_First_ le faire fonctionner, _then_ optimiser! –

Répondre

4

Je pense que la structure de données que vous recherchez est une matrice creuse. Stockez vos éléments avec leurs coordonnées dans une structure de données cartographiques (par exemple, Map<Integer,Map<Integer,Integer>> pour un tableau crypté 2d) et supposez que tout ce qui n'est pas dans la carte est nul.

+0

Oui je pense que je vais aller de cette façon .. il va économiser de la mémoire ainsi que le temps d'itération – Shwetanka

+1

+1 pour l'idée d'une matrice clairsemée, mais je suggère d'utiliser un type de clé qui ne nécessite pas tellement de complication . Comme 'Map ' ou une autre classe de clé spécialement créée qui est juste un conteneur pour les deux ints. –

0

Vous utilisez trop de mémoire. Utilisez moins ou en avez plus. Chaque élément int est de 32 bits. Et votre limite de mémoire de 512 Mo est bien inférieure à ce que vous pensez.

0

pour int [5000000] [5000000] vous avez besoin de 100000000000000B ou 100000GB. Vous ne pouvez donc attendre qu'une centaine d'années lorsque quelque chose comme ça va être possible.

+0

Vous pensez vraiment qu'il faudra 100 ans pour que 100000 Go soient économiques? Que diriez-vous d'un pari amical? –

+0

Le gagnant reçoit une clé USB de 10000 Go. –

8

Vous devrez peut-être envisager une approche de votre problème qui nécessite moins de mémoire.

de Google Calculator (en supposant une taille entière 64bit):

(5 000 000^2) * 64 bits = 186 264.515 gigabytes 
+0

wow c'est un énorme tableau! –

+1

Un int java est sépcifié comme 32 bits bien. –

+1

Je ne suis pas très familier avec les détails de Java, donc j'ai supposé la taille de l'entier par défaut pour un ordinateur 64 bits. Donc, je pourrais être parti par 93 000 Go ou plus. – pmalmsten

3

Eh bien, c'est 25 billions ints, chacun prend 4 octets, donc 100 billion d'octets d'ensemble. La solution la plus simple consiste à acheter ~ 90 téraoctets de RAM et un système d'exploitation 64 bits. Sérieusement, la bonne solution est probablement d'allouer une structure de données plus raisonnable qui peut stocker les données plus efficacement, en supposant que vous n'avez pas réellement besoin de charger 90 téraoctets de données dans la RAM à la fois. Peut-être que si vous postez plus sur le problème, nous pouvons donner une meilleure réponse?

+0

En fait, j'essaie de résoudre un problème de pratique sur codechef http://www.codechef.com/problems/PRIMPATT/. Je pense que je vais avoir besoin d'une matrice de cette taille. Toute aide est appriciée – Shwetanka

+3

Si la résolution du problème en modélisant le champ entier en mémoire vous conduit à avoir besoin d'un tableau de 90 téraoctets, c'est un très bon signal qu'il existe une meilleure façon de résoudre le problème. Je pense que vous auriez à trouver un moyen de déterminer si un carré donné est noir, sans réellement simuler l'ensemble du processus que le robot traverse. –

+0

Oui, je pense que je devrais changer l'approche. Mais une chose Si je convertis le type d'int en octet ça va aider? – Shwetanka

0

Vous avez besoin d'une structure de données plus éclairée. À moins que vous ayez réellement besoin de 25 billions d'entiers, ce qui est douteux.

0

C'est une matrice avec 5 millions de colonnes et 5 millions de lignes. Est-ce vraiment ce que tu voulais?

1

Parmi les autres réponses, vous avez une faute de frappe dans votre commande.

Il devrait être: java -Xmx512M Test

10

J'ai dû faire face même problème avec préoccupation Eclips Java tas et la solution était de réviser la mx512m en mx4096m ou mx2048m (étendre la limite maximale autorisée de la mémoire) donc dans votre cas, essayez la commande java Test -mx4096m ce qui permettra à Java d'utiliser 4 Go de votre RAM

+0

cela devrait être la réponse acceptée. – EyadMhanna

+0

travaillé merci – ghiath

+0

oui c'est juste – Firas

Questions connexes