"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

PHP script Performance

Facetious 31.03.2005 - 13:41 765 11
Posts

Facetious

Addicted
Avatar
Registered: Oct 2003
Location: Wien
Posts: 406
Hallo!

Mein Script, welches aus einem csv was ausliest funktioniert normalerweise sehr gut
Code: PHP
$zeilen = file('file.txt');
foreach($zeilen as $zeile){
  list($1,$2) = split(';',trim($zeile));
}
//tue irgendwas mit den Werten

mein problem ist aber jetzt, dass ich ein file mit ca. 85.000 Zeilen hab und Firefox hängt sich jedes mal auf wenn ich sie auslese.

meine frage, gibt es eine performance schonendere variante als meine?

tia und thx Facetious
Bearbeitet von Facetious am 01.04.2005, 08:00

funka

Legend
ex-prophet(down below)
Registered: Sep 2000
Location: Vienna / SF
Posts: 6131
firefox kann sich nicht bei einer zu heftigen serverseitigen arbeit aufhaengen
moegliche dinge: er timed aus
oder er bekommt zuviel daten

bei ersterem wird der server zu lange fuer die arbeit brauchen: loesungen:
* ueberlegen ob man wirklich alles auslesen muss
- braucht man wirklich alle 85000 eintraege jedesmal?
- oder doch nur einen teil?
* umstieg auf eine datenbank in erwaegung ziehen
* nicht jedesmal das das csv file processen, sprich die berechnungsoutputs zwischenzuspeichern und dieses dann aufrufen

bei zweiterem musst du einfach nur teile des outputs schicken
sprich [prev] 3000-6000 [next]

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4882
Was hat das Skript mit dem Clienterror zu tun? 85k Zeilen sind eben eine große Datenmenge, bis die übertragen (und bereitgestellt) wurde, vergeht eben Zeit.
Stell notfalls das Timeout höher bzw. gedulde dich.

Facetious

Addicted
Avatar
Registered: Oct 2003
Location: Wien
Posts: 406
Zitat von funka
bei ersterem wird der server zu lange fuer die arbeit brauchen: loesungen:
* ueberlegen ob man wirklich alles auslesen muss
- braucht man wirklich alle 85000 eintraege jedesmal?
- oder doch nur einen teil?
* umstieg auf eine datenbank in erwaegung ziehen
* nicht jedesmal das das csv file processen, sprich die berechnungsoutputs zwischenzuspeichern und dieses dann aufrufen

*ja ich muss alles auslesen
*aber nur 1 mal
*das ganze soll in eine datenbank, aber 85.000 zeilen abschreiben?

im konkreten soll der stundenplan meiner schule automatisiert werden und diese 85.000 zeilen sind in einem textfile gespeichert
ich will sie einmalig auslesen und in eine mysql db speichern

aber da man das nächstes jahr wieder den stundenplan einlesen muss, will ich es so lösen das sich nicht gleich alles "aufhängt" und dass es leicht und verständlich zu lösen ist.

hoffe ich habs verständlich dargelegt
mfg Facetious

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
a) http://at.php.net/set_time_limit

b) je nach datenbank, gibt es verschiedene import-utilities; damit könnte man es direkt einlesen.

c) je nach verwendungszweck, kann es sinnvoller sein, zeile für zeile einzulesen, als die ganze datei auf einmal.

d) offenbar unterstützt php kein mmap()

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von Facetious
hoffe ich habs verständlich dargelegt
mfg Facetious
Du hast immer noch nicht erklärt was du unter "aufhängen" verstehst.

Facetious

Addicted
Avatar
Registered: Oct 2003
Location: Wien
Posts: 406
naja
unter aufhängen versteh ich das ff im taskmanager 230.000 K Speicher braucht und sich nach 10 sekunden einfach selbst schließt

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25423
ff halt, was erwartest du.

für solche aufgaben gibts btw "massimporter", sowas macht man nie per webscript.

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
Btw, bei RAW performance duerftest du besser mit fgetcsv dran sein.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ich bezweifle trotzdem dass der Firefox was damit zu tun hat - ausser vielleicht du gibst das ganze auch an den Client aus :p

Facetious

Addicted
Avatar
Registered: Oct 2003
Location: Wien
Posts: 406
passt danke für die antworten
ich werd mich damit spieln und schaun ob ichs irgendwie zusammenbekomm

danke Facetious

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
achja, unter umständen bist du auch besser dran wenn du nicht mit file() gleich alles ladest, sondern mit fopen/fread zb. immer bis zum \n liest, kommt auf die länge der zeilen an: sehr lang -> fopen; kurz -> file

auf alle fälle verwendest am besten statt split explode, das sollte besser performen, da es keine Regulären Ausdrücke parsed.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz