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