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
Fatal Python error: deallocating None
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
Dann wissen vielleicht ein paar, was du falsch gemacht hast, obwohl sie den Error nicht kennen.
Gruß Markus
Hier ist die Funktion, welche den Fehler verursacht.
Im Internet finde ich auch nie ein Hinweis auf eine Lösung des Problems.
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)
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
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
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
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.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?
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
@ 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
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
NajaY0Gi hat geschrieben:Und dennoch solltest du die Autoren unbedingt von dem Fehler in Kenntnis setzen, auch wenn du einen Workaround gefunden hast!
http://www.stsci.edu/resources/software_hardware/numarray/ hat geschrieben:numarray is being phased out and replaced by numpy.
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
Davon ab ist numarray immer noch Quasistandard für gewisse Astronomieapplikationen. Ein Bugreport IMHO also durchaus angeraten.
Gruß,
Christian