|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Schleifenproblem bzw. Zugriff auf best. Zeilen
|
Seitenanfang |
Hallo, bin neu hier und möglichweise meine Überschrift falsch gewählt. Ok, folgendes Problem: Ich habe eine Datenfile die ungefähr so aussieht:10,354,53436 15,46436,23325 20,5345,3425 40,565,657 45,645657,545 50,6546,234 ... (ingesamt ca. 250000 ZEilen) Wie kann ich blockweise (Blocklänge hier bspw. 3 Zeilen) den Durchschnitt jeder Spalte ausrechnen. Also 10,354,53436 15,46436,23325 20,5345,3425 -------------- Schnitt jeder Spalte -> in $datei_schnitt 40,565,657 45,645657,545 50,6546,234 -------------- Schnitt jeder Spalte -> in $datei_schnitt anhängen Wie ich den Durchschnitt der gesamten Spalte über ALLE Zeilen ausrechne ist mir klar, aber ich bekomms blockweise nicht hin. Danke für jeden Hinweis. Perl-Newbie seit 3 Tagen
Datum: 15.12.2004-12:59

|
selbst gelöst! -> aber: Code-Optimierung
|
Seitenanfang |
Also hab selber noch eine Möglichkeit gefunden für mein Problem. Aber es ist extrem langsam, vermutlich durch das öffnen und schließen der Eingabe-Datei in jedem Durchlauf.hier der Code:
#! /usr/bin/perl -w$datei_in_block = "daten_bloecke.txt"; parameter(); rechnen_blockweise(); sub parameter { print "Periodendauer [ms] = "; chomp($periodendauer = <STDIN>); print "Gesamtzeit [s] = "; chomp($gesamtzeit = <STDIN>); $periodendauer = $periodendauer*1000; $gesamtzeit = $gesamtzeit*1000000; $werte_pro_periode = $periodendauer/2; $rechenbloecke = $gesamtzeit/$werte_pro_periode; open(BLOECKE,$datei_in_block) or die $!; @bloecke = <BLOECKE>; close(BLOECKE); $datensaetze = scalar(@bloecke); #Anzahl der Datensaetze ermitteln $werte_pro_block = $datensaetze/$rechenbloecke; print "-"x50,"\n"; print "zu rechnende Bloecke: $rechenbloecke\n"; print "Datensaetze pro Block: $werte_pro_block\n"; print "Anzahl Datensaetze: $datensaetze\n"; } sub rechnen_blockweise { for($i=0; $i<=$rechenbloecke-1; $i++) { $startzeile=$i*$werte_pro_block; $endezeile=$werte_pro_block+$i*$werte_pro_block; $zaehler=1; $spannung_speicher = 0; $strom_speicher = 0; $spannung2_speicher = 0; $strom2_speicher = 0; $spannungstrom_speicher = 0; print "von\t$startzeile\tbis\t$endezeile ==> "; open(INPUT,$datei_in_block) or die $!; while($zeile = <INPUT>) { if(($.>=$startzeile) && ($.<=$endezeile)) { my($zeit, $spannung, $strom) = split /\t/, $zeile; $spannung2 = $spannung*$spannung; $strom2 = $strom*$strom; $spannungstrom = $spannung*$strom; $spannung_speicher = $spannung_speicher+$spannung; $strom_speicher = $strom_speicher+$strom; $spannung2_speicher = $spannung2_speicher+$spannung2; $strom2_speicher = $strom2_speicher+$strom2; $spannungstrom_speicher = $spannungstrom_speicher+$spannungstrom; $schnitt_spannung = $spannung_speicher/$zaehler; $schnitt_strom = $strom_speicher/$zaehler; $schnitt_spannung2 = $spannung2_speicher/$zaehler; #$schnitt_strom2 = $strom2_speicher/$zaehler; $schnitt_spannungstrom = $spannungstrom_speicher/$zaehler; ++$zaehler; } } close(INPUT); $anstieg = ($schnitt_spannungstrom - ($schnitt_spannung*$schnitt_strom))/($schnitt_spannung2-( $schnitt_spannung*$schnitt_spannung)); $leitfaehigkeit = ($anstieg*0.00033333)/0.000000000001; print "$leitfaehigkeit pS/cm\n"; } }
der Code ist auch mit Datenfile hier downloadbar: http://www.tu-chemnitz.de/~hoema/rechnen.zip (113kb) Erforderliche eingaben: Periodendauer: 100 Gesamtzeit: 0.2 Es handelt sich hierbei nur um eine kleine Datenfile mit nur 4 zu errechnenden Werten. ich hab auch welche mit 32000 zu berechnenden Werten und da wirds extrem zäh! Vielleicht kann sich das ja mal jemand anschauen und Optimierungstips geben. Danke!
Datum: 15.12.2004-15:51

|
|

|

|

|
 |

|

|
|