Seite 1 von 1

For Loop stopt manchmal und machmal nicht

Verfasst: Dienstag 22. März 2011, 16:10
von cecile
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

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Dienstag 22. März 2011, 19:22
von deets
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.

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Dienstag 22. März 2011, 22:50
von b.esser-wisser
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

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Mittwoch 23. März 2011, 12:58
von cecile
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

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Mittwoch 23. März 2011, 13:13
von b.esser-wisser
Funktioniert numpy überhaupt mit ironpython?

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Mittwoch 23. März 2011, 13:45
von cecile
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....

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Mittwoch 23. März 2011, 14:35
von BlackJack
@cecile: Wenn es nicht ohne `numpy` geht, bleibt vielleicht die Frage was Dich an IronPython fesselt?

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Mittwoch 23. März 2011, 14:52
von cecile
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.

Re: For Loop stopt manchmal und machmal nicht

Verfasst: Mittwoch 23. März 2011, 15:09
von BlackJack
@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.