Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache - Optimierung für Dateibearbeitung
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
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
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;
?>
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
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
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
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
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);
?>
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)
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.