PHP script Performance

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php_script_performance_139850/page_1 - zur Vollversion wechseln!


Facetious schrieb am 31.03.2005 um 13:41

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


funka schrieb am 31.03.2005 um 13:48

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 schrieb am 31.03.2005 um 13:49

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 schrieb am 31.03.2005 um 13:53

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 schrieb am 31.03.2005 um 16:10

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 schrieb am 31.03.2005 um 18:20

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 schrieb am 31.03.2005 um 18:53

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 schrieb am 31.03.2005 um 19:04

ff halt, was erwartest du.

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


Rektal schrieb am 31.03.2005 um 20:59

Btw, bei RAW performance duerftest du besser mit fgetcsv dran sein.


watchout schrieb am 01.04.2005 um 00:58

ich bezweifle trotzdem dass der Firefox was damit zu tun hat - ausser vielleicht du gibst das ganze auch an den Client aus :p


Facetious schrieb am 01.04.2005 um 08:00

passt danke für die antworten
ich werd mich damit spieln und schaun ob ichs irgendwie zusammenbekomm

danke Facetious


watchout schrieb am 01.04.2005 um 11:04

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.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025