Java - como no saturar la memoria, muy importante

 
Vista:

como no saturar la memoria, muy importante

Publicado por alejandro (279 intervenciones) el 30/05/2007 07:38:14
Saludos compañeros, estoy terminando mi aplicacion de proyecto de carrera y me he encontrado ante un problema bastante grande, y es que al introducir pruebas a veces como resultado recibo un poco complaciente OutOfMemoryError, y por lo que me habeis comentado puede ser al rellenar la matriz y los vectores que tengo. Esto lo hago de la siguiente manera:

vector_alfabeto=new Vector();
matriz=new LinkedList [tam+1][tam+1];
matriz_aux=new LinkedList [tam+1][tam+1];
matriz_original=new LinkedList [tam+1][tam+1];

for (int a=0; a<tam+1; a++)
for (int b=0; b<tam+1; b++)
{
matriz[a][b]=new LinkedList();
matriz_aux[a][b]=new LinkedList();
matriz_original[a][b]=new LinkedList();
}

Cada componente de la matriz es una lista de caracteres del tipo: a, b,e, c ...
Es cierto que la dimension a veces puede ser muy grande.

Como lo puedo solucionar ???
Como puedo saber que es exactamente lo que se desborda y en que punto concreto ???

Por favor ayudadme, muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:como no saturar la memoria, muy importante

Publicado por Gonzalo (180 intervenciones) el 30/05/2007 08:21:53
¿De qué tamaño estamos hablando? Es decir, ¿cuánto vale tam aproximadamente?

Por otra parte, ¿exactamente qué es lo que haces con esta estructura? Porque a lo mejor lo que se puede hacer es plantear el problema de otra forma en la que no tengas que usar 3 matrices de Listas Enlazadas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:como no saturar la memoria, muy importante

Publicado por alejandro (279 intervenciones) el 30/05/2007 23:07:09
Lo de ampliar la memoria ya lo probe, pero nada.

El tamaño puede ser muy grande, de 1000 o mas.
Uso una, y luego dos auxiliares, trabajo sobre una, en la que se van guardando los caracteres (cada casilla son listas de caracteres) y se van uniendo algunas casillas (cuando se cumplen ciertos requisitos, se unen los contenidos; si uno el estado 4 y el 6, el 4 pasa a contener lo de 4 mas lo d 6, y el 6 nada).
Las otras dos estructuras son auxiliares, copio los datos, por si la union que se hizo no me vale posteriormente, para deshacer los cambios.

Espero que me haya explicado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:como no saturar la memoria, muy importante

Publicado por Gonzalo (180 intervenciones) el 31/05/2007 09:16:18
¿¿3 millones de listas enlazadas??! Normal que se te vaya de memoria, eh.

Con una prueba rapidilla, un LinkedList con 10 elementos ocupa más o menos unos 300bytes (sin contar lo que ocupan los elementos). No parece mucho, pero claro, si tienes 3 millones de LinkedList, cada uno con unos pocos elementos, así haciendo un cálculo aproximado, en poco tiempo te pones a usar alrededor de 1Gb! Unos 300Mb por cada una de las matrices.

Creo que deberías plantear el problema de otra forma. Piensa estas preguntas:

¿Qué representa la matriz de 1000 x 1000?
¿Usas realmente todas las casillas?
¿Necesitas que sea una matriz? ¿No podrías usar otro tipo de estructura?

¿Qué representa la lista de una casilla?
¿Todas las casillas tienen que tener una lista siempre?
¿Necesitas que las listas sean LinkedList? ¿Podría valerte usar ArrayList?

¿Necesitas realmente las dos copias auxiliares?
Si sólo son para deshacer cambios, ¿no podrías mantener para eso una estructura más pequeña que sólo contenga lo que vas a cambiar en esa acción?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:como no saturar la memoria, muy importante

Publicado por Candy (3 intervenciones) el 30/05/2007 11:31:45
Otra opción es que aumentes la memoria "allocated" por la maquina virtual cuando ejecutas la aplicacion poniendo un parametro tipo : -Xmx512m

slds
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar