Jörg Reinholz: ipliste auswerten

Beitrag lesen

Moin!

Na dann: (In PHP)

Kannst ja probieren. (ERST ALLES LESEN!)

<?php
for ($i=1; $i < 256; $i++) {
   $classA[$i]=0;
   $classB[$i]=array();
   $classC[$i]=array();
   $classD[$i]=array();
   for ($k=1; $k < 256; $k++) {
       $classB[$i][$k]=0;
       $classC[$i][$k]=array();
       $classD[$i][$k]=array();
       for ($l=1; $l < 256; $l++) {
          $classC[$i][$k][$l]=0;
          $classD[$i][$k][$l]=array();
          for ($m=1; $m < 256; $m++) {
              $classD[$i][$k][$l][$m]=0;
          }
       }
   }
}

Ungefähr das hier passiert, wenn jede IP(v4) einmal "klickt":

Das Skript hat Speicher ohne Ende gebraucht und auf meinem System zur Nutzung von 12GB RAM geführt. Mit einer langsamen Platte hätte ich aufgeben können. (SWAP!)

Zeiten:

real    1m39.223s
user    1m3.586s
sys     0m11.457s

Dafür habe ich es jetzt schön warm.

Versuchen wir es anders herum:

<?php
$classA=array();
$classB=array();
$classC=array();
$classD=array();

$handle = fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
        $row=trim($buffer);
        if ($row) {
            list($a, $b, $c, $d) = explode('.', $row);
            if (! isset($classA[$a]) ) {
                $classA[$a]=1;
            } else {
                $classA[$a]++;
            }

            if (! isset($classB[$a]) ) { $classB[$a]=array(); }
            if (! isset($classB[$a][$b]) ) {
                $classB[$a][$b]=1;
            } else {
                $classB[$a][$b]++;
            }

            if (! isset($classC[$a][$b]) ) { $classC[$a][$b] = array(); }
            if (! isset($classC[$a][$b][$c]) ) {
                $classC[$a][$b][$c]=1;
            } else {
                $classC[$a][$b][$c]++;
            }

            if (! isset($classD[$a][$b][$c]) ) { $classD[$a][$b][$c] = array(); }
            if (! isset($classD[$a][$b][$c][$d]) ) {
                $classD[$a][$b][$c][$d]=1;
            } else {
                $classD[$a][$b][$c][$d]++;
            }
        }
    }
    fclose($handle);
} else {
   echo "da war nichts zu lesen...";
}

print "\nA: ";
print_r($classA);
print "\nB: ";
print_r($classB);
print "\nC: ";
print_r($classC);
print "\nD: ";
print_r($classD);

liefert mit 27 Zeilen "192.168.1.2" erwartungsgemäß:

A: Array
(
    [192] => 27
)

B: Array
(
    [192] => Array
        (
            [168] => 27
        )
)

C: Array
(
    [192] => Array
        (
            [168] => Array
                (
                    [1] => 27
                )
        )
)

D: Array
(                                                                                                                                                   
    [192] => Array
        (                                                                                                                                           
            [168] => Array                                                                                                                          
                (                                                                                                                                   
                    [1] => Array                                                                                                                    
                        (                                                                                                                           
                            [2] => 27                                                                                                               
                        )                                                                                                                           
                )
        )
)

und geht ziemlich fix:

real    0m0.046s
user    0m0.026s
sys     0m0.017s

... sollte also ungefähr das sein, was Du willst.

Jörg Reinholz