PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache - Optimierung für Dateibearbeitung



Onx
03.02.04, 10:39
Hi Leute,

ich möchte mit PHP-Skripten grosse Dateien ca. 5 MB mit einem Suchmuster scannen und bearbeiten. Das klappt auch schon ganz gut mit preg_replace, aber es dauert immer so um die 20 min, bis er durch ist. Wie kann ich Apache optimieren, damit das schneller geht?

Danke

Jan

Jinto
03.02.04, 21:13
1. Deine Aufgabenstellung und die Arbeitsweise deines Programm's sind mehr als unzureichend erläutert und beschrieben (Quelltext?)
2. Programmierfragen werde idR im Schesterforum www.mrunix.de beantwortet. (Ok, an dem Punkt sieht man, dass ich das Problem eher bei deinem Skript als beim Apachen sehe).

HTH

Onx
03.02.04, 21:46
Okay, okay, hier ist das Programm, ganz simpel eigentlich.
Das Programm soll alle Datumsfelder einer Datei vom Format 01,01,2004 in 01.01.2004 umwandeln. Das macht es auch ganz brav :-) Dauert halt nur ein wenig.
Demnächst werde ich auch nur im Schwesterforum posten, versprochen.


<?PHP
$datei = "test.txt";
$fp = fopen ($datei, "r+");
$str = fread ($fp, filesize ($datei));
$str = str_replace(".", ",", $str);


$str = ereg_replace("([0-9]{2}),([0-9]{2}),([0-9]{4})","\\1.\\2.\\3",$str);


$fp = fopen ("ausgabe.txt","w");
fwrite($fp,$str);



fclose ($fp);
echo $str;
?>

Jinto
04.02.04, 03:29
Du sollst nicht nur im Schwesterforum posten, du sollst nur Programmierfragen dort posten :p

Korrigier mich, wenn ich dein Programm missverstehe:
Du gehst hin und ersetzt im ersten Schritt alle . durch ,. Danach gehst du hin und ersetzt wirderum alle , durch , sieht nach doppelter Arbeit aus. Warum ersetzt du nicht gleich mit deinen Wunschdaten?

Ein weiteres Problem kann liegt IMO in der Art der Stringverarbeitung an sich, starte das Programm mal auf der Kommandozeile und schau dir seinen Speicherverbrauch an. Ich denke der wird enorm sein, da du das komplette File in den Speicher packst und dort als einen riesen String verarbeitest.

Schreib dein Programm um, dass Zeile für Zeile eingelesen und verarbeitet wird.

HTH

Onx
04.02.04, 14:46
Zum Programm:

Stimmt, sieht auf den ersten Blick ein wenig dümmlich aus, aber das ist so:
Ein amerikanisches Programm liefert Exportdateien nur mit durch Punkt getrennte "Nachkommastellen" ( 100.14 statt 100,14).

Jetzt hat ein Tupel nur ein Datumsfeld und ganz viele Zahlenfelder. Deswegen ist es einfacher, soherum zu arbeiten.

Zum Speicher:

Klar verbraucht es zu viel. Wie programmiert man das mit dem zeilenweise denn?

Für einen Tipp bin ich sehr dankbar :-)

Jan

Jinto
04.02.04, 23:07
Original geschrieben von Onx
Klar verbraucht es zu viel. Wie programmiert man das mit dem zeilenweise denn?
Für einen Tipp bin ich sehr dankbar :-) Das mit dem Zeilenweise war doch schon der Tipp.
Peudocode:
öffne input.txt lesen
öffne ausgabe.txt
solange dateiende nicht erreicht lese eine Textzeile aus input.txt ein, ändere diese und schreib sie nach ausgabe
fertig

Der Geschwindigkeitsgewinn sollte enorm sein. Beispiel (original ist deine Routine):
Datei enthält x Zeilen mit folgendem Inhalt: 01.02.2004


10.000 Zeilen:real 0m8.160s (orig) real 0m1.386s (umgeschrieben)
20.000 Zeilen:real 0m30.211s (orig) real 0m2.166s (umgeschrieben)
30.000 Zeilen:real 0m59.274s (orig) real 0m2.179s (umgeschrieben)



ja ich hätte es dir auch direkt fertig hinschreiben können, will ich aber nicht (so bringt es dir IMO mehr).

Weitere Möglichkeiten zu Optimierung bieten pcre und ein besseres Suchpattern, dass nur noch einmalig Ersetzungen durchführt (diese sind aber bei weitem nichtmehr so effektiv, wie das von mir beschrieben umschreiben des Programm's).

Damit dir jemand hilft dein Suchmuster zu optimieren müsstest du allerdings auch noch eine Datenzeile veröffentlichen (evtl. entsprechend modifziert, aber nicht so stark, dass sie nichtmehr dem original schema entsprechen). Aber schau erstmal, dass du dein Programm wie o. g. umschreibst.

HTH

Onx
04.02.04, 23:15
Okay, danke für den Pseudocode.
Ich werde es mal versuchen. Kann etwas dauern, ich bin leider kein guter Programmierer, aber für das ein oder andere reicht es :-)

Danke soweit

Jan

Onx
05.02.04, 12:26
So, bin fertig. Wenn man es einmal raus hat, ist es gar nicht so schwer :-)

Es dauert jetzt nur noch 2-3 sec. allerdings ohne eine Ausgabe im Browser.

<?PHP
$datei = "test.txt";
$fp = fopen ($datei, "r+");
$new = fopen ("toll.txt", "w+");

while($line = fgets($fp, 5000)) {

$line = str_replace(".", ",", $line);

$line = ereg_replace("([0-9]{2}),([0-9]{2}),([0-9]{4})","\\1.\\2.\\3",$line);

fputs($new, $line);
}
echo"$new";

fwrite($new,0);


fclose ($fp);

?>

Jinto
05.02.04, 22:52
Was mit mit besserem Code, alles bewirken kann: von 20minuten runter auf 2-3 Sekunden. :D

Gruß


PS: du hast vergessen die Ausgabe datei zu schliessen ($new)

Onx
06.02.04, 11:13
Ach ja, hab ich vergessen :-/

Die Beschleunigung kommt aber auch vor allem dadurch, dass die Datei nicht mehr dargestellt wird. Na ja egal, es ist auf jeden Fall unheimlich viel schneller und das zählt!

Danke noch mal :-))))

Jan