Ticket #1712 (new defect)

Opened 5 years ago

Last modified 5 years ago

Uso de RAM en TOL: Redefinición de conjuntos

Reported by: pgea Owned by: vdebuen
Priority: high Milestone: Mantainance
Component: Kernel Version: 3.1
Severity: critical Keywords:
Cc:

Description

Al redefinir conjuntos parece quedarse sin liberar, parte de la información anterior del conjunto.

El siguiente ejemplo, que devuelve simplemente 2000 conjuntos vacíos, hace uso de RAM como si mantuviese todas las matrices temporales creadas en el cuerpo de la función del For:

Set For(1, 2000, Set (Real i) {
  Set range = [[
    Matrix Rand(200, 200, 0, 1)
  ]];
  Set range := Copy(Empty);
  range
});

aumentando la RAM unos 630 MB cuando se esperarían apenas unos KB.

Change History

Changed 5 years ago by pgea

Parece que la matriz se queda enganchada en el almacenamiento de la definición del conjunto, en la instancia de BList con los argumentos con los que se creó.

La variante:

Set For(1, 2000, Set (Real i) {
  Set range = Copy(Empty);
  Set range := [[
    Matrix Rand(200, 200, 0, 1)
  ]];
  Set range := Copy(Empty);
  range
});

ya no presenta este problema.

Changed 5 years ago by pgea

El problema puede resolverse, destruyendo la definición del objeto (almacenada en los atributos args_ y array_ de los BTmpContens) justo después de su evaluación (método CalcContens) y no, como ocurre ahora, que sobrevive hasta la destrucción del objeto.

Esta solución afectaría positivamente a muchas funciones que devuelven una de estas instancias. Por ejemplo, también solucionaría el tique #1707.

Changed 5 years ago by vdebuen

Yo creo que es algo que merece la pena probar, aunque habrá que hacer un proceso de chequeo bastante fuerte para asegurarnos de que no deja de funcionar alguna otra cosa inesperada.

Changed 5 years ago by pgea

(In [5979]) Refs #1707, #1712
Se introduce un método (ForgetArgs()) en BTmpObject que nos permita deshacernos de los argumentos almacenados (por las derivadas de BTmpContens) una vez que es el calculado el contenido (contens_) del objeto.

Note: See TracTickets for help on using tickets.