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
comment:2 Changed 12 years ago by
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
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.
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:
ya no presenta este problema.