SOLUCIONADO problema con el consumo de memoria.

Daniel Jiménez dani.berzas en gmail.com
Mie Oct 5 11:05:57 CEST 2005


Gracias!!!
Efectivamente era eso, Chema, las diferentes pilas de memoria.

El problema es que los datos que vas a pasar de C a Python no los puedes
liberar en C, pero si los reservas con las funciones de C malloc(),etc
no se liberan nunca, ya que Python y C usan distintas pilas de memoria.
Para usarlos en C y que los pueda liberar el Python han de ser
reservados con Py_Mem_New().
---------------------------------------------------------------------
mal --> hp = (double *) calloc(tama_hp ,sizeof(double));
bien --> hp = (double *) PyMem_New (double, tama_hp);
---------------------------------------------------------------------

Por otro lado yo estaba usando arrays de tipo PyNum, para los que el la
dirección de inicio de los datos es un puntero a char.

inter = PyArray_FromDimsAndData(1,(int *)&tama_hp, PyArray_DOUBLE, (char
*)hp);
char *data, A pointer to the first data element of the array.
http://starship.python.net/crew/hinsen/NumPyExtensions.html
--------------------------------------------------------------------

Indicar así mismo que para PyList_SET_ITEM() no es necesario decrementar
las referencias, porque las 'roba'. No así PySequence_SetItem().
http://docs.python.org/api/refcountDetails.html
--------------------------------------------------------------------

El esquema del código C queda de la siguiente manera:

{
carga los datos (listas de arrays) con PyArg_ParseTuple().
ListaSalida = PyList_New(..);
ListaHp = PyList_New(n_esp);
bucle1
{  hp =  PyMem_New (double, tama_hp);
   (calcula hp)
    inter = PyArray_FromDimsAndData(1,(int *)&tama_hp, PyArray_DOUBLE,
(char *)hp);
    PyList_SET_ITEM(ListaHp,i,inter);
} 

PyList_SET_ITEM(ListaSalida,0,(PyObject *)ListaHp);
return ListaSalida;
}

Quiero daros las gracias a todos por vuestras sugerencias y ayuda.
Habría sido incapaz de seguir sin ellas.
Dani.



> Daniel Jiménez escribió:
> 
> >>No veo en el fragmento de código liberes la memoria con un free(hp). 
> > 
> > El caso es que si quiero transferir ListaSalida (que contiene a ListaHp,
> > que contiene a las hp) no puedo liberar esa memoria 'dentro de c', he de
> > liberarla dentro de Python, cuando ya haya usado los datos que ha
> > generado el C.
> > 
> > Probé a liberar la memoria antes, pero me da violación de segmento
> > porque C le pasa a Python una dirección (ListaSalida) cuyos elementos
> > han sido liberados.
> > 
> > Por eso pienso que la acción de liberar memoria hay que realizarla en
> > Python, o tal vez volver a C y liberarla allí.
> 
> Lo que pasa es que python y C usan diferentes pilas de memoria (heaps).
> Si quieres que la memoria reservada quede bajo la autoridad del
> recolector de basura la tendrás que reservar con PyMem_Malloc()
> 
> Nunca he creado módulos externos, pero si sigue dándote problemas
> envíame los fuentes a ver si puedo echarle un vistazo este fin de semana.
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es