Tal vez me estoy yendo de tema, pero en un sistema que hice para
procesar muchos datos terminé aplicando flyweights a cosas que no
esperaba, como numeros, fechas o nombres. Por ejemplo, si tengo una
colección con 1 millon de "Facturas del mes", entonces la cantidad de
fechas posibles son 30 y no 1 millón. Y está claro que tener 30 fechas
es mas barato en términos de memoria y de muchas operaciones (y a
veces mas caro de instanciar al principio). Viniendo de un pasado de
bases de datos relacionales, siempre tendía a "factorizar" lo obvio,
cosas como Ciudad, Cliente, Género, Tipo, etc.. Pero nunca pensé que
el importe de una factura , la fecha o un "campo string" debían
factorizarse. Pero en Smalltalk resulta muy natural hacerlo y darse
cuenta que tampoco suelen existir 1 millón de importes distintos, ni
un millón de nombres distintos, de hecho los nombres de personas son
muy pocos. Además en ese tipo de colecciones, los objetos suelen tener
mas de una fecha y mas de un variable de instancia de tipos numéricos,
por lo que la misma instancia suele vivir en varias partes del objeto.
Si me tocara analizar a la población de Argentina, la fechas de
nacimiento REALES no serían 40 millones, serían unas 40 mil, o sea mil
veces menos objetos. Algo que a veces pasa es que cuando se encuentran
muchas repeticiones el tiempo de instanciación de las colecciones
también baja mucho porque a la VM le cuesta menos hacer búsquedas que
reservar tanta memoria.
Para tranformar un objeto en otro que esté siendo usado previamente
les mando el mensaje #used, que obviamente me devuelve el objeto del
pool para su reemplazo. Todo esto tiene muy bajo costo en términos de
diseño y empiezan a aparecer beneficios por donde uno menos lo espera.
En mi caso, a clave fue sacarme las reglas de factorización de la
cabeza y prestarle mas atención al inspector de Smalltalk.
Diego Coronel
On 3 mayo, 14:16, Angel Java Lopez <
ajlopez2...@gmail.com> wrote:
> Interesante tema/problema..
>
> Por que hay millones de float? Yo me imagino algun calculo, pero igual
> luego el garbage collector deberia liberarlos. El problema es la memoria?
> se acaba? Se necesitan los millones de floats, digo, que esten
> referenciados y no sean liberados por el GC? no habra forma de cambiar el
> algoritmo? O el problema es el tiempo (mucho tiempo creando) y no la
> memoria?
>
> 2012/5/3
dcorone...@gmail.com <
dcorone...@gmail.com>