Mailinglisten-Archive |
Norbert Pfeiffer schrieb:
> Hallo,
>
> eine Textdatei mit 11 Mio Zeilen wird geoeffnet und zeilenweise eingelesen.
> Dabei wird eine Schleife verwendet, die jeweils 99 Zeilen einliest, fuer
> jede Zeile get_browser aufruft und das Ergebnis in ein Array schreibt:
was ich probieren würde:
> <?php
> $OUT = array();
> $x = 0;
> while(!feof($f0)) {
> $agent = trim(fgets($f0, 333));
^^ weglassen
> $UA = get_browser($agent);
$UA = get_browser($agent, true);
> $BR = get_object_vars($UA);
^^ weglassen
> $browser = $BR['browser'];
^^ weglassen
> $n = (isset($OUT[$browser])) ? ($OUT[$browser] + 1) : 1;
> $OUT[$browser] = $n;
^^ zusammenfassen
> $x++;
> echo ($x % 99 == 0) ? sprintf('% 11s', number_format($x,0,',','.')).
^^ 99 erhöhen
> sprintf('% 7s', number_format(count($OUT),0,',','.'))."\n" : '';
> }
> ?>
> Leider braucht PHP dazu rund 2 sec pro Umlauf was auf eine
> Gesamtverarbeitungszeit von rund 15,5 Stunden schliessen laesst.
>
> Wie bekommt man das auf ca. 1 Stunde runter ... ?
<?php
$OUT = array();
$x = 0;
while(!feof($f0)) {
// PHP 4
$UA = get_browser(fgets($f0, 333), true);
$browser = $UA['browser'];
// PHP 5
//$browser = get_browser(fgets($f0, 333))->browser;
$OUT[$browser] = (isset($OUT[$browser])) ? ($OUT[$browser] + 1) : 1;
$x++;
echo ($x % 99 == 0) ? sprintf('% 11s', number_format($x,0,',','.')).
sprintf('% 7s', number_format(count($OUT),0,',','.'))."\n" : '';
}
?>
wie schnell ist denn get_browser()?
eventuell das Ergebnis cachen:
...
$agent = trim(fgets($f0, 333));
if (! isset($cache[$agent])) {
$cache[$agent] = get_browser(fgets($f0, 333))->browser;
}
$OUT[$cache[$agent]] = (isset($OUT[$browser])) ? ($OUT[$browser] + 1) : 1;
...
php::bar PHP Wiki - Listenarchive