keeper: Speicher wird immer voller .....

Beitrag lesen

Hallo habe folgendes Problem...

Ich habe eine Logauswertumg geschrieben die auch läuft :-)
Das Problem ist das wenn die LOGDATEIN grösser sind so ca. 60MB - 300MB läuft mir der Speicher immer zufoll so das Linux das Prog serlber abschiest.

Nun meine Frage kann mir jemand sagen wo mir der speicher in meinem Programm voll läuft suche echt schon seit tagen aber komme auf keinen grünen zweig.

Ich muss dazu sagen das ich kein grosser Perlprogrammierer bin !
Also bitte nimmt rücksicht.
Bin aber für tips und verbesserungs vorschläge am skript immer offen .

Wer über eure hilfe sehr erfreut.

Hier das Skript:.....

#!/usr/bin/perl

##################################
##   Craeted by   ##
##     Marc Stöffken  ##
##  Stoeffken@HEIMHAUS.de ##
##################################

Auswerten von PSI Log-Datein

use Getopt::Std;
use DBI;
use XBase;

$opt_p = "";
$opt_n = "";
$opt_h = "";
#$opt_f = "";
getopt('pnhf');      #pfadangabe

@para = ("AUFTRAG=","MONTEUR=" ,"VIEWMONTEUR=" ,"VL=" ,"VIEWVL=" ,"ID=" ,"RND=" ); #parameter

$db = $opt_n;      #name der datenbank
$DB_DIR      = $opt_p;    #pfad für die datenbank
$DB_DSN      = "DBI:XBase:$DB_DIR"; #DNS der daten bank
$DB_USER     = "";     #benutzername für dei datenbank
$DB_PASSWD   = "";     #passwort für dei datenbank
$tr = ';' ;       #Trennzeichen für die Ausgabe
$hk = '' ;       #"String"
#############################Suche Nach Login und Logout in der Logdatei###############################
#&ueberschrift;
&info;
#open (DATEN , "$opt_f |");
while ($zeile = <STDIN>)

{
  if ($zeile =~ m/(\D{3}\s+\d+)\s(\d\d:\d\d:\d\d)\s\D+\s\wwwGW[(\d+)]:\s\Requesting\s/(.+)/io )
    {
    if ($zeile =~ m/%(..)/io)
      {
      $zeile =~ s/%(..)/pack("c",hex($1))/ge;
      }
    $datum = $1;
    $loginid =$3;
    $loginuhr =$2;
    $rest =$4;
    $datum =~ s/\s+/ /i ;
    &datum ;
    if ($zeile  =~ m /isalive?/io)
      {
      if ($zeile =~ m/\wwwGW[(\d+)]/io)
 {
 @kill = $1;
 }
      }
     else
      {
      ($prozmon , $temp)  = split/&/, $rest;
      ($proz3 , $temp)    = split /MONTEUR=/, $prozmon;
      ($proz , $undef)    = split (/?/, $proz3);
      ($temp ,$pingpong ) = split (/?/, $rest);

foreach  $para(@para)
 {
 if ($pingpong =~ s /$para\d+//i )
   {
   $parama = $pingpong;
   $parama =~ s/&&/&/g;
   $parama =~ s/^&//g;
   $parama =~ s/&$&/&/g;
   }
        }
      $wert = "$hk$logindatum$hk"."$tr"."$hk$loginid$hk"."$tr"."$hk$proz$hk"."$tr"."$hk$undef$parama$hk"."$tr";
      $end{$loginid} = $wert;
    foreach  $para(@para)
 {
 if ($zeile =~ m /$para(\d+)/)
     {
   $suck3 = $end{$loginid};
   $wert = "$suck3"."$hk$1$hk"."$tr";
   $end{$loginid} = $wert;
   }
  else
    {
   $wert = "$wert"."$tr";
   $end{$loginid} = $wert;
   }
 }
      }
    }
  if ($zeile =~ m /(\D{3}\s+\d+\s\d\d:\d\d:\d\d)\s\D{7}\s\wwwGW[(\d+)]:\s\Document is not accessible./io)
    {
    $suck2 = $end{$loginid};
    $wert = "$suck2"."$hk$byte1$hk$tr$hk$byte3$hk\n";
    $end{$loginid} = $wert;
    }
  if ($zeile =~ m /(\D{3}\s+\d+\s\d\d:\d\d:\d\d)\s\D{7}\s\wwwGW[(\d+)]:\sReduce\sResult/io)  #kommt das suchmuster(für log out) hin!!
    {
    $logoutid = $2;
    foreach $eintrag (@kill)
      {
 if ($eintrag == $logoutid)
 {
 delete $kill{$eintrag};
 }
       else
 {
 @daten = ($logoutid);
 ($temp , $byte) = split/from / , $zeile;
 ($byte1 , $byte2) = split/ Bytes to / , $byte;
 ($byte3 ,$temp ) = split/ / , $byte2;
 foreach $zz (@daten)
     {
   if ($zz == $logoutid)
     {
     $suck = $end{$logoutid};
     $wert = "$suck"."$hk$byte1$hk$tr$hk$byte3$hk\n";
     $end{$logoutid} = $wert;
       &datenbankausgabe;
     delete $end{$logoutid};
  delete $daten{$logoutid};
     }
   }
 }
      }
    }
  }

#close (DATEN);
sub datum
{
 ($monat,$tag)= split/ /,$datum;
 ($temp,$temp,$temp,$temp,$temp,$jahr1) = localtime(time);
 $jahr = $jahr1 +1900 ;
 if ($monat eq "Jan")
  {$monat = 1;}
 elsif ($monat eq "Feb")
  {$monat = 2;}
 elsif ($monat eq "Mar")
  {$monat = 3;}
 elsif ($monat eq "Apr")
  {$monat = 4;}
 elsif ($monat eq "May")
  {$monat = 5;}
 elsif ($monat eq "Jun")
  {$monat = 6;}
 elsif ($monat eq "Jul")
  {$monat = 7;}
 elsif ($monat eq "Aug")
  {$monat = 8;}
 elsif ($monat eq "Sep")
  {$monat = 9;}
 elsif ($monat eq "Oct")
  {$monat = 10;}
 elsif ($monat eq "Nov")
  {$monat = 11;}
 elsif ($monat eq "Dez")
  {$monat = 12;}
if ( $tag < '0')
{$tag = '0' . $tag ;
}
 $logindatum = sprintf("%02d.%02d.%04d %s", $tag, $monat, $jahr, $loginuhr);
}

sub ueberschrift
{
foreach $zzzz (@para)
 {$header = "$header$hk$zzzz$hk$tr"}
print "$hk"."Datum/Uhrzeit$hk"."$tr"."$hk"."Proz. ID$hk"."$tr"."$hk"."Ausgeführter Proz.$hk"."$tr"."$header"."$hk"."Byte1 $hk$tr$hk"."Byte2 $hk";
}

sub datenbankausgabe
{
($time, $pid, $param, $request, $auftrag,  $monteur, $viewmonteur, $vl, $viewvl, $id, $rnd, $bytes1, $bytes2) = split (/;/ ,$end{$logoutid});
$request =~ s/&&/&/g;
$request =~ s/^&//g;
$request =~ s/&$//g;
#print "$time, $pid, $request, $auftrag, $param,  $monteur, $viewmonteur, $vl, $viewvl, $id, $bytes1, $bytes2\n";
#sleep 1;
$dbh = DBI->connect($DB_DSN, $DB_USER, $DB_PASSWD, { RaiseError => 1, AutoCommit => 1 } ) or die;
my $sth = $dbh->prepare( "INSERT INTO $db ( TIME , PID , REQUEST , PARAM , AUFTRAG , MONTEUR , VIEWMONTEU , VL , VIEWVL , ID , RND , BYTES1 , BYTES2 ) VALUES ( '$time', '$pid', '$param', '$request', '$auftrag', '$monteur', '$viewmonteur', '$vl', '$viewvl', '$id', '$rnd', '$bytes1', '$bytes2' )");
$sth->execute();
$sth->finish;
$dbh->disconnect;

}

sub info
{
 if ($opt_h eq "?")
  {
  print "-h ?   #zeigt die Hilfe an \n";
  print "-n [DB-Name]  #deklariert den DB - Namen \n";
  print "-p [DB-Dir]  #deklariert den BD - Pfad \n" ;
  print "-f [READ_FILE]  #File aus dem gelesen werden soll \n";
  die;
  }

}