Fatal Python error: deallocating None

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Troell
User
Beiträge: 8
Registriert: Dienstag 14. August 2007, 14:39

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
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Kannst du ein Beispiel posten mit mit dem es sich Reproduzieren lässt?
Troell
User
Beiträge: 8
Registriert: Dienstag 14. August 2007, 14:39

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)

Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
Troell
User
Beiträge: 8
Registriert: Dienstag 14. August 2007, 14:39

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Ein Bugreport an die Autoren von numarray böte sich auch an
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Troell
User
Beiträge: 8
Registriert: Dienstag 14. August 2007, 14:39

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Und dennoch solltest du die Autoren unbedingt von dem Fehler in Kenntnis setzen, auch wenn du einen Workaround gefunden hast!
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten