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