﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
1101	Excessive and strange RAM usage	Pedro Gea	Víctor de Buen Remiro	"Intentando solucionar problemas debidos al excesivo consumo de memoria RAM me encuentro con una circunstancia que no soy capaz de explicarme.

Resulta que al utilizar dos funciones que aparentemente deberían funcionar igual se obtienen comportamientos distintos en el consumo de RAM. Esto también se aprecia en el incremento de NObjects.

Aunque merece la pena insistir que no se trata de un problema de perdida de memoria, sino de un aparente consumo excesivo de memoria.

1. En primer lugar creamos un conjunto de matrices grandes para aprenciar bien los cambios en RAM.

{{{
Set matrices = For(1, 500, Matrix (Real i) {
  Rand(50000, 1, 0, 1)
});
}}}

Si comprobamos el incremento de NObject obtenemos 2507:
{{{
Real no1 = Copy(NObject);
Set matrices = For(1, 500, Matrix (Real i) {
  Rand(50000, 1, 0, 1)
});
Real no2 = Copy(NObject);
Real no2 - no1;
//-> 2507 
}}}

Mientras que si asignamos un nombre a las matrices recién creadas obtenemos 507:
{{{
Real no1 = Copy(NObject);
Set matrices = For(1, 500, Matrix (Real i) {
  Matrix a = Rand(50000, 1, 0, 1)
});
Real no2 = Copy(NObject);
Real no2 - no1;
//-> 507 
}}}

Sin embargo esto no parece afectar al consumo de RAM siendo en ambos casos de unos 288 MB aproximadamente.

2. En segundo lugar definimos dos funciones que devuelven la matriz pasada como argumento con el nombre ""nombre"":

{{{
Matrix Use1(Matrix object) {
  Matrix nombre = Copy(object)
};
Matrix Use2(Matrix object) {
  Matrix nombre = object
};
}}}

La primera asigna una copia del objeto, mientras que la segunda no hace la copia.
Aunque como son asignaciones por valor se espera que esto sea lo mismo.

Las consecuencias sin embargo no son para nada similares:

Si hacemos uso de {{{Use1}}} (la que hace copia) tanto el valor de NObject como la RAM aumentan lo esperado. La RAM crece otros 288 MB hasta los 576 MB comparada con el comienzo.
{{{
Real no3 = Copy(NObject);

Set matrices2 = EvalSet(matrices, Anything (Matrix m) {
  Matrix data = m;
  Use1(data) 
});

Real no4 = Copy(NObject);
Real no4 - no3;
//-> 505
}}}

Mientras que si hacemos uso de {{{Use2}}} tanto el valor de NObject como la RAM aumentan excesivamente. La RAM crece 576 MB (en lugar de la mitad) llegando hasta los 864 MB comparada con el comienzo:

{{{
Real no3 = Copy(NObject);

Set matrices2 = EvalSet(matrices, Anything (Matrix m) {
  Matrix data = m;
  Use2(data) 
});

Real no4 = Copy(NObject);
Real no4 - no3;
//-> 2505
}}}

El problema está en el consumo de RAM, y no en que aparezcan más o menos NObjects, aunque sin duda sería interesante comprender lo que está ocurriendo.

"	doubt	closed	highest	Mantainance	Kernel		blocker	fixed		
