Speicherproblem

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Hallo zusammen,

Folgendes Problem: Ich lese einen Datenstream mittels einer Software/Hardware aus. Der Hersteller hat dafür ein
Python Interface bereitgestellt. Soweit so gut, wenn ich einen Dauertest fahre hat der Python exe Prozess binnen
einer Nacht ca. 1GB, sprich Systemabsturz. Auf Nachfrage beim Hersteller wurde mir der Quellcode geschickt, welcher
dann zu einer pyd Datei kompiliert wird. Aus diesem Quellcode stammt folgender Codeausschnitt:

Code: Alles auswählen

        ....
        piValues = PyMem_Realloc(piValues, sizeof(int) * iCount);
        dimensions[0] = iCount;
	if(!(objArray = (PyArrayObject *) PyArray_FromDimsAndData(n_dimensions, dimensions, type_num, (char *) piValues)))
        {
		PyMem_Free(piValues);
		return NULL;
	}
	return PyArray_Return(objArray);
piValues wird nach vorherigem PyMem_Malloc reallokiert und es wird mittels PyArray_FromDimsAndData(...) ein Array mit Werten
(piValues) erzeugt. Für den Fall, dass der Array nicht erzeugt werden konnte werden die piValues freigegeben und return.
Im positiven Fall wird der Array zurückgegeben, die piValues allerdings nicht freigegeben. Dazu meine Frage: Ist es möglich,
dass der Speicherauflauf daher kommt, dass piValues im positiven Fall der Speicher nicht freigegeben wird, oder wäre im
Falle einer Speicherfreigabe von piValues auch der Array "kaputt"?

Danke für eure Hilfe.
BlackJack

@MBR: So wie ich die Beschreibung hier: http://structure.usc.edu/numarray/node54.html verstanden habe, könnte das ein Speicherleck sein wenn der Speicher für die Daten nicht irgend wo anders explizit wieder freigegeben wird.
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Vielen Dank für den Link. Demnach muss der Speicher für den Array nachdem ich die Werte erfasst habe
wieder freigegeben werden. Versucht habe ich das schon mittels pymem, genaugenommen der API
Funktion PyMem_Free(Array), bzw. auch PyMem_Free(ctypes.c_void_p(id(array)). Leider brachte das
auch nicht den gewünschten Erfolg. Wende ich die Funktionen falsch an, oder gibts es noch andere
Möglichkeiten den allokierten Speicher wieder freizugeben?

Im vorliegenden Fall wird der Speicher "c-seitig" allokiert. Besteht da überhaupt eine Möglichkeit den
Speicher "python-seitig" freizugeben?
BlackJack

@MBR: Ich kenne mich mit der Numpy/Numarray-API nicht so gut aus. Freigeben musst Du den Speicher auf den der Zeiger in `piValues` zeigt. Du müsstest also auf der C-Seite diese Adresse wieder aus dem `PyArrayObject` herausbekommen und da dann ganz normal `free` darauf anwenden. Oder Dich bei der Numpy-C-API nach einer Funktion umsehen, die ein Array-Objekt erstellt, das sich auch um den Speicher beim Zerstören der Objekte selbst kümmert. So etwas müsste es IMHO ja geben.
Antworten