perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 25
Click for quality!




11.02.2012 / 16:19

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragSchleifenproblem 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

Beitragselbst 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

-






-
-