1 Sep 2011 18:02
Re: Re: Help!
Algunas ideas (from the top of my head)...
1) reutilizar la memoria (en tu caso b). Si queres guardar el undo, hacerlo a traves de la antitransformacion (en lugar de guardar los datos de origen, guardar la operacion para volver al origen) o indicarle al usuario que ese comando no se puede deshacer porque usa datos muy grandes.
2) reservar X mb de antemano para operaciones de undo y utilizar esa memoria con tu propio "asignador" para utilizarla (eso evita un poco la defragmentacion)
3) crear tu propio reservador de memoria que compacte y utilizarlo al menos para estas cosas (seguramente encontraras algun "ejemplo" por ahi)
salu2
estebanp
2011/9/1 Enrique Nieloud <enieloud-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Gente,
No, no era culpa del pobre Antigrain Geometry.
Pero, ya sé que es. De hecho, he logrado reproducir la falla, varias
veces, y de la misma forma en que describe Deborah.
Es un tema de manejo de memoria.
El tema es que ella trabaja con imágenes grandes (70 MB).
El programa internamente tiene el siguiente comportamiento:
Lo que les muestro es una visión esquemática y super simplificada del
orden en que se aloca la memoria. De hecho las alocaciones suceden en
distintas partes del programa, y en el medio pueden haber algunas que
otras alocaciones más en el heap.
BEGIN // lo siguiente se realiza muchas veces:
a = malloc(70Mb)
// trabaja con a
b = malloc(2Mb)
// copia data de a hacia b
Free(a)
// b no se libera porque forma parte de la cola de undo.
END
Los 70Mb y 2Mb son a título de ejemplo, para tener una idea de los
tamaños que estamos hablando.
Explota porque de hecho llega un momento en que malloc devuelve cero.
Cuando explota, está muy lejos de llegar a los 2Gb.
Supongo que malloc falla por el exceso de fragmentación.
El problema se produce en una clase que se llama Image.
El "malloc" está en el ctor de la clase Image, el "free" desde ya,
está en el destructor.
¿Cambiará algo si reemplazamos malloc por new?
Una idea que se me ocurre es sacar afuera el malloc afuera, esto quizá
sirva para reducir la fragmentación del heap:
a = malloc(70Mb)
BEGIN // lo siguiente se realiza muchas veces:
// trabaja con a
b = malloc(2Mb)
// copia data de a hacia b
// b no se libera porque forma parte de la cola de undo.
END
Free(a)
Pero realmente esta idea complica un poco las cosas, y pedería algo de
independencia. (Igual se hace!)
¿Alguna alternativa para evitar tanta fragmentación interna?
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
RSS Feed