Mailinglisten-Archive |
René Thiel wrote: > Hallo, > > ich hatte im Sommer einen Auftrag, Log-Dateien auszuwerten. > Dafür wurden mir Log-Dateien mit max. 52.000 Zeilen zur Verfügung > gestellt. Klappte alles wunderbar. > > Jetzt kam der Auftraggeber mit Problemen beim Einlesen in die DB. > Also forderte ich die kompletten Archive an und fand darin Dateien mit > fast 1.000.000 Zeilen (für einen Monat! Die Auswertung soll jahreweise > geschehen). > > Damit braucht Apache/2.0.55 (Win32) PHP/5.1.6 (in Kombination mit > MySQL 5.0.17) mehr als die eingestellten 600 sec, um die einzelnen > Zeilen in jeweils mehrere DB-Felder zu überführen :-( > Einfach nur jede Zeile unbearbeitet in die DB zu schreiben, dauerte > soeben gewaltige 336 sec! (122 MB) > > Kann es sein, das PHP/MySQL (unter Windows - so die Vorgabe) > doch nicht für derartige Datenmengen geeignet ist? > Oder gibt es Möglichkeiten zur Optimierung? Hallo Es gäbe sicher Möglichkeiten, die schneller wären als PHP, aber man muss es ja sowieso in die DB schreiben, von wird der Vorteil einer anderen Sprache begrenzt sein. Was Optimierung angeht kann ich ohne deinen Code zu kennen nur raten. Wird jede Zeile als einzelnes Insert an MySQL geschickt? Wenn ja, kann man da sicher optimieren, entweder prepared Statement benutzen oder mehrere Datensätze gleichzeitig eintragen. (Beispiel: INSERT INTO table (id, name) VALUES (1, 'wert1'), (2, 'wert'), ...) Was ist den das eigentliche Problem mit der Geschwindigkeit, woher kommen diese 600 Sekunden? Je mehr Daten das verarbeitet werden, desto länger dauert es, wenn der Kunde im nächsten Jahr doppelt soviele Logfiles hat, muss das auch irgendwie gehen. Wenn die Auswertung jahresweise geschieht, wird das Script ja nicht sehr häufig aufgerufen nehme ich an. Ev. ist es auch eine Möglichkeit, eine Art Fortschrittsanzeige einzubauen, damit man weiss, ob das Script "noch tut". Datei x / y verarbeitet, xxx Zeilen verarbeitet, etwas in der Art. Gruss Sascha
php::bar PHP Wiki - Listenarchive