PHP script Performance
Facetious 31.03.2005 - 13:41 765 11
Facetious
Addicted
|
Hallo! Mein Script, welches aus einem csv was ausliest funktioniert normalerweise sehr gut $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)
|
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
|
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
|
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!
|
a) http://at.php.net/set_time_limitb) 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
Legendundead
|
hoffe ich habs verständlich dargelegt mfg Facetious Du hast immer noch nicht erklärt was du unter "aufhängen" verstehst.
|
Facetious
Addicted
|
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
AdministratorLegends never die
|
ff halt, was erwartest du.
für solche aufgaben gibts btw "massimporter", sowas macht man nie per webscript.
|
Rektal
Here to stay
|
Btw, bei RAW performance duerftest du besser mit fgetcsv dran sein.
|
watchout
Legendundead
|
ich bezweifle trotzdem dass der Firefox was damit zu tun hat - ausser vielleicht du gibst das ganze auch an den Client aus
|
Facetious
Addicted
|
passt danke für die antworten ich werd mich damit spieln und schaun ob ichs irgendwie zusammenbekomm
danke Facetious
|
watchout
Legendundead
|
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.
|