For Loop stopt manchmal und machmal nicht

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
cecile
User
Beiträge: 18
Registriert: Dienstag 24. August 2010, 12:20

Dienstag 22. März 2011, 16:10

I habe ein Problem mit einem Foor Loop der Mathematische berechnungen macht, jedes 10te mal läuft das programm voll durch, aber die anderen Male hängt es fest. Auf dem Task Manager sieht man dass der CPU load zuerst hoch ist und plötzlich auf 0 abfällt wenn das Programm hängen bleibt.

Code siehe hier:

Code: Alles auswählen

from pyexcel import *
import gc
import math
import numpy as num
import copy
import datetime

class calstat(): 
    def __init__(self,calfile):  # läuft perfekt durch
        wbread=Workbook(False,calfile)
        self.Arange={}
        self.Brange={}
        self.Crange={}
        self.Srange={}
        self.Overload={}
        self.PAR={}
        self.SN=wbread.ReadCell('iSAR',5,6)
        date=wbread.ReadCell('iSAR',6,6)
        year=int(date/365.252252252252)+1899
        day=int((date/365.252252252252-int(date/365.252252252252))*365.252252252252)
        self.date=datetime.date(year,12,31)+datetime.timedelta(days=day)
        Aarray=num.zeros([256])
        for ws in range(1,wbread.CountWorksheets()+1):
            calstate=wbread.ReadCell(ws,3,5) #check if it is a calibration sheet (3E=256)
            if calstate==256:
                freq=str(int(wbread.ReadCell(ws,6,5)))
                modname=wbread.ReadCell(ws,10,5)
                levels=wbread.ReadCell(ws,9,5)
                self.Overload[modname]=wbread.ReadCell(ws,14,5)
                colA=int(6+levels*2)
                colB=int(colA+1)
                colC=int(colB+1)
                #print colA,colB,colC
                if modname=='CW':
                    #Arange=wbread.ReadCol(ws,colA)
                    Aread=wbread.ReadCol(ws,colA)
                    for a in range(256):
                        Aarray[a]=Aread[a,0]
                    self.Arange[freq]=copy.copy(Aarray) # needs to be copied, for not to be a pointer
                if levels==7:
                    self.Brange[modname]=wbread.ReadCol(ws,colB)
                    self.Crange[modname]=wbread.ReadCol(ws,colC)
                    #data has to be called as self.Brange['CW'][1,0]
        wbread.Close()
        
    def readreference(self,sensortype,Gel):
        #sensortype: old, new, FXX
        #Gel: HSL, MSL
        BCfile='../input/'+sensortype+'_'+Gel+'_mod.csv'
        BC=num.loadtxt(BCfile,dtype='S20',delimiter=';',skiprows=3)
        self.BCref={}
        for bci in range(num.size(BC,0)):
            self.BCref[BC[bci,0]]=BC[bci,1:5]
            
    
    def curveErrors(self,modname): # Diese Funktion ist die welche Probleme macht
        eSARV=num.array([0.019,0.049,0.115,0.246,0.495,0.732,1.067])*(10**(self.Overload[modname]/10))
        eSARdbsensor=num.zeros([7])
        eSARdBrefx=num.zeros([7])
        eSARdBrefy=num.zeros([7])
        errorvalues=num.zeros([256])
        A=13.9
        #ref points
        for k in range(7):
            #print "for1"+str(k)
            eSARdBrefx[k]=A+10*math.log10(eSARV[k])+float(str(self.BCref[modname][0]))*math.log10(1+float(str(self.BCref[modname][1]))+eSARV[k])
            eSARdBrefy[k]=A+10*math.log10(iSARV[k])+float(str(self.BCref[modname][2]))*math.log10(1+float(str(self.BCref[modname][3]))+eSARV[k])
        #sensors
        for s in range(256):
            print "for2"+str(s)
            for k in range(7): #Manchmal bleibt der Code hier hängen                          
                iSARdbsensor[k]=A+10*math.log10(iSARV[k])+self.Brange[modname][s,0]*math.log10(1+self.Crange[modname][s,0]+eSARV[k])
            if s%2==0:
                print "if" #Manchmal bleibt der Code hier hängen    
                errorvalues[s]=math.sqrt(sum((eSARdbsensor-eSARdBrefx)**2)/7)
            else:
                print "else" #Manchmal bleibt der Code hier hängen    
                errorvalues[s]=math.sqrt(sum((eSARdbsensor-eSARdBrefy)**2)/7)
        
        self.Srange[modname]=errorvalues
Zuletzt geändert von Anonymous am Dienstag 22. März 2011, 16:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
deets

Dienstag 22. März 2011, 19:22

Das ist dermassen kompliziert und abhaenging von so vielen externen Dingen - das kann dir hier keiner so direkt beantworten. Mein Ratschlag: exessiv logging einbauen (print-statements, oder modul logging, falls du annimmst, das waere auch in Produktion notwendig).

Dann genau eingrenzen *wo* das Ding kleben bleibt. Vielleicht koennen wir dann mehr sagen.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Dienstag 22. März 2011, 22:50

Die schleife ist doch eh' unnötig - das geht mit numpy doch anders:

Code: Alles auswählen

import numpy as num
eSARdBrefx = A \
  + 10 * num.log10(eSARV) \
  + self.BCref[modname][0] * num.log10(1 + self.BCref[modname][1] + eSARV)
eSARdBrefy = A \
  + 10 * num.log10(iSARV) \
  + self.BCref[modname][2] * num.log10(1 + self.BCref[modname][3] + eSARV)
Und wozu ist 'float(str(...))' gut ? sind da 'fractions' oder 'decimal' im Spiel?

Zusätzlich zu dem was deets gesagt hat kannst du dir evtl. noch pdb anschauen - den debugger

hth, Jörg
cecile
User
Beiträge: 18
Registriert: Dienstag 24. August 2010, 12:20

Mittwoch 23. März 2011, 12:58

So ich habe den Code jetzt vereinfacht und einige Zeilen aufgesplitet, aber der hängt immer noch immer jedes zweite mal.... jetzt gibt es keine abhängigkeiten von aussen mehr.
Anscheinend hängt der Code aber nur in IronPython in Python läuft er durch.

Code: Alles auswählen

import numpy as num
import math

def fortest():
        BCref=num.empty(4)
        Brange=num.empty(256)
        Crange=num.empty(256)
        Overload=3.14
        iSARV=num.array([0.019,0.049,0.115,0.246,0.495,0.732,1.067])*(10**(Overload/10))
        iSARdbsensor=num.zeros([7])
        iSARdBrefx=num.zeros([7])
        iSARdBrefy=num.zeros([7])
        errorvalues=num.zeros([256])
        A=13.9
        #ref points
        for k in range(7):
            #print "for1"+str(k)
            iSARdBrefx[k]=A+10*math.log10(iSARV[k])+BCref[0]*math.log10(1+BCref[1]+iSARV[k])
            iSARdBrefy[k]=A+10*math.log10(iSARV[k])+BCref[2]*math.log10(1+BCref[3]+iSARV[k])
        for s in range(256):
            print "for2"+str(s)
            for k in range(7):                          
                iSARdbsensor[k]=A+10*math.log10(iSARV[k])+Brange[s]*math.log10(1+Crange[s]+iSARV[k])
            if s%2==0:
                print "if"
                errorvalues[s]=sum((iSARdbsensor-iSARdBrefx)**2)
                print "step0"
            else:
                print "else"
                errorvalues[s]=sum((iSARdbsensor-iSARdBrefy)**2)
                print "step0"
            errorvalues[s]=errorvalues[s]/7
            print "step1"
            errorvalues[s]=errorvalues[s]**(0.5)
            print "step2"
        
        return errorvalues
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Mittwoch 23. März 2011, 13:13

Funktioniert numpy überhaupt mit ironpython?
cecile
User
Beiträge: 18
Registriert: Dienstag 24. August 2010, 12:20

Mittwoch 23. März 2011, 13:45

Ja wenn man es richtig installiert und die IronPython shell mit xframes startet:

IronPython-2.6\ipy -X:Frames

wenn numpy und IronPython nicht richtig konfiguriert sind dann gibt es schon bei "import numpy" eine Fehlermeldung...
Im übrigen läuft der Code ja jedes 5.te mal durch... also wenn numpy nicht laufen würde, würde er gar nie durchlaufen
ohne numpy wird der Code aber auch extrem mühsam....
BlackJack

Mittwoch 23. März 2011, 14:35

@cecile: Wenn es nicht ohne `numpy` geht, bleibt vielleicht die Frage was Dich an IronPython fesselt?
cecile
User
Beiträge: 18
Registriert: Dienstag 24. August 2010, 12:20

Mittwoch 23. März 2011, 14:52

IronPython ist Vorgabe des Arbeitgebers...

Leider ist das ganze Dazu gehörige System in IronPython...

im übrigen kann ich auf Python keine Excel files lesen mit:
import clr
clr.AddReference("Microsoft.Office.Interop.Excel")

Und daher kann ich meine Externen Funktionen nicht verwenden.
BlackJack

Mittwoch 23. März 2011, 15:09

@cecile: Um Excel-Dateien zu lesen gibt es auch für CPython Module. Aber wenn es eine Vorgabe vom Arbeitgeber ist…

Wenn das Problem nicht deterministisch auftritt würde ich hier auf ein Problem zwischen IronPython und Numpy tippen und die Frage mehr in Richtung `numpy`-Community und -Entwickler stellen.
Antworten