Mailinglisten-Archive |
Hallo Das Problem der Geschwindigkeit ist vermutlich der Speicherverbrauch. Ich würde versuchen, das ganze mehr aufzuteilen. Wie bisher die Datei mit fopen öffnen und dann Zeile für Zeile mit fgets und gleich verarbeiten: also ein explode auf ',', prüfen ob der Datensatz schon in der Datenbank vorhanden ist und wenn nicht, speichern. Um noch weiter Geschwindigkeit zu gewinnen, könnte man noch die Query's zusammenfassen und zum Beispiel 1000 Datensätze gleichzeitig eintragen mit INSERT INTO table(feld1, feld2, ...) VALUES (wert1, wert2, ...), (wert1, wert2, ..) ... Der Vorteil dieser Lösung ist, das PHP niemals mit einem mehrdimensionalen Array mit 50'000 Elementen arbeiten muss, sondern immer nur mit einer Zeile. Gruss Sascha Thomas Winter wrote: > Hallo, > > ich benutze PHP5 und mySQL 5.0.18 und lese aus einer Textdatei eine große > Anzahl an Daten ein. > > Ich benutze die mySQL-class (ich glaube phplib). > > Mit jedem query wird auch ein $this->connect() gemacht. Daher habe ich > mysql.allow_persistent auch schon auf ON gestellt. > > Ich lese die Textdatei mit fopen($datei,'r'), dann ein while, ein explode mit > \n, dann ein explode für die Felder der Zeile mit ',' und ich erhalte ein > Array mit 5 Elementen. > Dann prüfe ich auf doppelte Datensätze mit einem query. Da ich bereits > mehrmals abgebrochen haben muss ich erst mal 50000 Datensätze nur prüfen und > nicht schreiben. > > Zur Kontrolle lasse ich mir in der Console den Datensatz ausgeben. > Ich erwarte eigentlich das die Daten in der Console "rasen", es ist aber so > langsam das ich bequem mitlesen kann. > > Was ist da denn so langsam, ist explode so kompliziert oder liegt es dem mySQL > SELECT. Die Felder sind nicht indiziert, aber selbst als es nur einige > Hundert Datensätze in der Datenbank waren fand ich es nicht signifikant > schneller.
php::bar PHP Wiki - Listenarchive