close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 12 years ago

Last modified 11 years ago

#1712 new defect

Uso de RAM en TOL: Redefinición de conjuntos

Reported by: Pedro Gea Owned by: Víctor de Buen Remiro
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 (4)

comment:1 Changed 12 years ago by Pedro Gea

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.

comment:2 Changed 12 years ago by Pedro Gea

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.

comment:3 Changed 12 years ago by Víctor de Buen Remiro

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.

comment:4 Changed 11 years ago by Pedro Gea

(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.