Seite 1 von 1

Fatal Python error: deallocating None

Verfasst: Dienstag 14. August 2007, 14:46
von Troell
Hi,

ich habe schon nach diesem Thema gesucht, aber nichts gefunden.
Einige von euch kennen bestimmt diese Fehlermeldung:

Fatal Python error: deallocating None

Kann mir zufällig jemand sagen, was genau das Problem ist und (noch wichtiger) wie ich es beheben kann?

Der Fehler tritt auf beim Abarbeiten einer größeren Datenmenge mit nuumarray.

Mit print sys.getrefcount(None) kann ich zusehen, wie der Zähler auf 2 sinkt, dann kommt der Abbruch des Programms.

Vielen Dank im voraus,
Troell

Verfasst: Dienstag 14. August 2007, 15:10
von Markus12
Ich kenne den Error leider nicht, aber am besten stellst du einfach das Script hier rein! ;)

Dann wissen vielleicht ein paar, was du falsch gemacht hast, obwohl sie den Error nicht kennen.

Gruß Markus

Verfasst: Dienstag 14. August 2007, 15:20
von veers
Kannst du ein Beispiel posten mit mit dem es sich Reproduzieren lässt?

Verfasst: Dienstag 14. August 2007, 15:30
von Troell
Hier ist die Funktion, welche den Fehler verursacht.
Im Internet finde ich auch nie ein Hinweis auf eine Lösung des Problems.

Code: Alles auswählen

def get_D_max(values_array, cdf_meas, values_pred, cdf_pred):	
	D = []
	
	for i in numarray.arange(0,len(values_array),1):
		#print values_array[i]
		
		index_2 = numarray.argmin(numarray.fabs(values_pred-values_array[i]))
		
		#print '\n+++++++++++'
		#print index_1
		#print index_2
		#print '\n---'
		#print values_array[index_1]
		#print values_pred[index_2]
		#print '\n---'
		#print cdf_meas[index_1]
		#print cdf_pred[index_2]
		#print '+++++++++++\n'
		
		print sys.getrefcount(None)
		
		D.append(copy.deepcopy(math.fabs(cdf_pred[index_2]-cdf_meas[i])))
		del index_2
	
	#print D
	return max(D)


Verfasst: Dienstag 14. August 2007, 15:55
von veers
Hm dein Beispiel kann ich nicht ausführen ;)
Von dem was google so ausspuckt würde ich aber darauf schliessen das es an numarray liegt.

Verfasst: Dienstag 14. August 2007, 16:18
von Troell
Die 4 übergebenen Parameter sind numarray-arrays.
Funktionieren tut der Algorithmus, nur bricht er ab.

Statt numarray zu verwenden, kann ich dies auch über doppelte FOR - Schleifen und IF - Abfragen lösen...... NUR dies dauert natürlich.

Also ja, es liegt an numarray.


Mit :

import numarray
import math
import copy
import sys

und :

(values_array, cdf_meas, values_pred, cdf_pred) jeweils
=
numarray.array(numarray.arange(1,6000,1), 'Float64')

müsste es eigentlich gehen.

Grüße,
Troell

Verfasst: Dienstag 14. August 2007, 17:09
von veers
Hm kann das Problem bei mir reproduzieren. Lösen konnte ich es leider nicht :/ Wie wäre es wenn du anstelle von numarray numeric verwenden würdest?
Dürfte damit auch möglich sein.

Verfasst: Dienstag 14. August 2007, 19:02
von Joghurt
Ein Bugreport an die Autoren von numarray böte sich auch an

Re: Fatal Python error: deallocating None

Verfasst: Dienstag 14. August 2007, 19:10
von birkenfeld
Troell hat geschrieben:Hi,

ich habe schon nach diesem Thema gesucht, aber nichts gefunden.
Einige von euch kennen bestimmt diese Fehlermeldung:

Fatal Python error: deallocating None

Kann mir zufällig jemand sagen, was genau das Problem ist und (noch wichtiger) wie ich es beheben kann?
Zusätzlich zu dem, was andere schon gesagt haben: Das ist in keinem Fall ein Fehler in deinem Code, sondern immer in irgend einer C-Erweiterung (mir noch nie untergekommen). Numarray scheint da ein flscahes Py_DECREF eingebaut zu haben, was dummerweise Nones Referenzzähler dekrementiert.

Verfasst: Mittwoch 15. August 2007, 09:21
von Troell
Hi an alle,

@ birkenfeld:

Ja, das stimmt.


Also, nach einigem rum probieren, habe ich rausbekommen, dass es an der

"numarray.argmin()"

Funktion liegt, welche diesen Fehler verursacht.

Eine wirkliche Lösung des Problems habe ich leider nicht gefunden, nur einen Umweg.

Wenn man statt:

"index_2 = numarray.argmin(numarray.fabs(values_pred-values_array))"


folgendes schreibt:

"diff = numarray.fabs(values_pred-values_array)"
"index_2 = numarray.where(diff==min(diff))[0][0]"

Für meine Anwendung ist dies ok, es gibt jedoch den Unterschied, dass der obige Code auch für Matrizen funktioniert, der Umweg wegen "min()" jedoch nur für 1-dim. Arrays.


Trotzdem Danke an alle für eure Ratschläge.

Troell

Verfasst: Mittwoch 15. August 2007, 14:24
von Y0Gi
Und dennoch solltest du die Autoren unbedingt von dem Fehler in Kenntnis setzen, auch wenn du einen Workaround gefunden hast!

Verfasst: Mittwoch 15. August 2007, 17:08
von veers
Y0Gi hat geschrieben:Und dennoch solltest du die Autoren unbedingt von dem Fehler in Kenntnis setzen, auch wenn du einen Workaround gefunden hast!
Naja
http://www.stsci.edu/resources/software_hardware/numarray/ hat geschrieben:numarray is being phased out and replaced by numpy.

Verfasst: Donnerstag 16. August 2007, 14:56
von Y0Gi
Das heißt ja nicht, dass der Fehler in NumPy nicht auch besteht. Davon ab erfordern einige Projekte leider immer noch z.B. das ebenfalls durch NumPy ersetzte Numeric.

Verfasst: Donnerstag 16. August 2007, 17:13
von CM
Ob der Bug in numpy besteht, weiß ich natürlich nicht mit letzter Sicherheit, aber ich verwende numpy.argmin regelmäßig bei Berechnung von Abstandsverteilungsfunktionen in arrays mit zehntausenden Zahlen. Bei mir läuft es stabil.

Davon ab ist numarray immer noch Quasistandard für gewisse Astronomieapplikationen. Ein Bugreport IMHO also durchaus angeraten.

Gruß,
Christian