Große Daten effektiv einlesen
horn
- php
Hallo,
ich würde gerne Dateien in PHP einlesen. Das Problem ist nur, dass es auch ziemlich große Dateien werden und daher suche ich eine möglichst elegante Lösung für das Problem um möglichst große Dateien verarbeite zu können.
Ich habe also ein .txt Dokument unbekannter Größe und möchte jetzt jedes Wort in meine Datenbank schreiben (doppelte uninteressant und ,.!? dürfen ignoriert werden).
Ich hatte zunächst versucht die Datei zeilenweise einzulesen und anschließen aus der Zeile jedes Wort zu extrahieren und in die DB zu übertragen, jedoch kam es dann zu einer Zeitüberschreitung.
Kann mir jemand helfen?
Hallo,
Ich hatte zunächst versucht die Datei zeilenweise einzulesen und anschließen aus der Zeile jedes Wort zu extrahieren und in die DB zu übertragen, jedoch kam es dann zu einer Zeitüberschreitung.
Auf einem Rechner durchführen, bei dem du die max_execution_time steuern kannst bzw. per Shell-Zugriff?
Gruß
jobo
Ich hatte zunächst versucht die Datei zeilenweise einzulesen und anschließen aus der Zeile jedes Wort zu extrahieren und in die DB zu übertragen, jedoch kam es dann zu einer Zeitüberschreitung.
Kann mir jemand helfen?
Das Script muß sich die letzte eigelesene Zeile merken, sich danach selber aufrufen und ab der letzten Zeile +1 weitermachen.
Und das Ganze so lange, bis die Datei komplett drin ist.
Ist im Prinzip kein Hexenwerk. Findest Du sicher auch im Netz viele Anwendungsbeispiele.
Grüße, Steffen
Ich hatte zunächst versucht die Datei zeilenweise einzulesen und anschließen aus der Zeile jedes Wort zu extrahieren und in die DB zu übertragen, jedoch kam es dann zu einer Zeitüberschreitung.
Kann mir jemand helfen?
Das Script muß sich die letzte eigelesene Zeile merken, sich danach selber aufrufen und ab der letzten Zeile +1 weitermachen.
Und das Ganze so lange, bis die Datei komplett drin ist.
Ist im Prinzip kein Hexenwerk. Findest Du sicher auch im Netz viele Anwendungsbeispiele.
Grüße, Steffen
Nein! Das ist nicht so einfach! Wenn man Zeilenweise einliesst und ein Abbruch statt findet (Datei geschlossen), wir man den Dateizeiger beim öffnen nicht so einfach setzen können - ich würde es eher mit blockweisen Lesen versuchen.
Ich hatte zunächst versucht die Datei zeilenweise einzulesen und anschließen aus der Zeile jedes Wort zu extrahieren und in die DB zu übertragen, jedoch kam es dann zu einer Zeitüberschreitung.
Kann mir jemand helfen?
Das Script muß sich die letzte eigelesene Zeile merken, sich danach selber aufrufen und ab der letzten Zeile +1 weitermachen.
Und das Ganze so lange, bis die Datei komplett drin ist.
Ist im Prinzip kein Hexenwerk. Findest Du sicher auch im Netz viele Anwendungsbeispiele.
Grüße, Steffen
Nein! Das ist nicht so einfach! Wenn man Zeilenweise einliesst und ein Abbruch statt findet (Datei geschlossen), wir man den Dateizeiger beim öffnen nicht so einfach setzen können - ich würde es eher mit blockweisen Lesen versuchen.
Gut hast du zufällig ein Script oder kannst du mir ein paar hilfereiche Funktionen nennen?
Ich hatte bisher noch nie mit großen Daten zu tun und bin daher nicht so bewandert was das angeht.
Mit $dban->insert($wort); wird das Wort in die Datenbank übertragen wie müsste ich den Rest gestalten? Die Funktion getword($str); liefert das Wort aus der Zeile bzw. ich müsste sie dann umschreiben.
Ich hatte zunächst versucht die Datei zeilenweise einzulesen und anschließen aus der Zeile jedes Wort zu extrahieren und in die DB zu übertragen, jedoch kam es dann zu einer Zeitüberschreitung.
Kann mir jemand helfen?
Das Script muß sich die letzte eigelesene Zeile merken, sich danach selber aufrufen und ab der letzten Zeile +1 weitermachen.
Und das Ganze so lange, bis die Datei komplett drin ist.
Ist im Prinzip kein Hexenwerk. Findest Du sicher auch im Netz viele Anwendungsbeispiele.
Grüße, Steffen
Nein! Das ist nicht so einfach! Wenn man Zeilenweise einliesst und ein Abbruch statt findet (Datei geschlossen), wir man den Dateizeiger beim öffnen nicht so einfach setzen können - ich würde es eher mit blockweisen Lesen versuchen.
Gut hast du zufällig ein Script oder kannst du mir ein paar hilfereiche Funktionen nennen?
Ich hatte bisher noch nie mit großen Daten zu tun und bin daher nicht so bewandert was das angeht.
Mit $dban->insert($wort); wird das Wort in die Datenbank übertragen wie müsste ich den Rest gestalten? Die Funktion getword($str); liefert das Wort aus der Zeile bzw. ich müsste sie dann umschreiben.
Siehe http://www.php.net/manual/de/book.filesystem.php
Die gelesenen Datenblöcke kannst du in Stings und/oder Wörter trennen.
Siehe dazu http://www.php.net/manual/de/book.strings.php.
Wenn du pinnglig sein musst, dann kannst du prüfen, ob am Ende eines
Datenblocks ein Wort geteilt wurde (ein Wort wurde nicht geteilt wenn
am Ende des gelesenen Datenblocks oder am Anfang des Folgebocks ein
Leerz., Tabulator, Return, ... steht).
So long
(Hallo|Hi(ho)|Nabend) horn,
Ich hatte zunächst versucht die Datei zeilenweise einzulesen und anschließen aus der Zeile jedes Wort zu extrahieren und in die DB zu übertragen, jedoch kam es dann zu einer Zeitüberschreitung.
Diese Einschränkung der Script-Laufzeit lässt sich abstellen.
Schon mal von set_time_limit(0) gehört?
MffG
EisFuX
Hi!
Diese Einschränkung der Script-Laufzeit lässt sich abstellen.
Schon mal von set_time_limit(0) gehört?
Wenn der Hoster nichts dagegen hat. Man kann den Gebrauch der Funktion verbieten. Und es gibt Hoster, die killen das Script hart von außen. Da kannst du mit set_time_limit() einstellen, was du willst, wenn der Prozess gekillt wird, ist Sense.
Lo!
(Hi(gh)?) dedlfix,
Schon mal von set_time_limit(0) gehört?
Wenn der Hoster nichts dagegen hat. Man kann den Gebrauch der Funktion verbieten. Und es gibt Hoster, die killen das Script hart von außen. Da kannst du mit set_time_limit() einstellen, was du willst, wenn der Prozess gekillt wird, ist Sense.
Richtig. Da aber im Ausgangsposting kein Wort von Shared Hosting erwähnt wurde, habe ich das weggelassen.[0]
Schließlich kann man in der schon angegebenen Anleitung selbst oder im von dort verlinkten Abschnitt zu max_execution_time in der Konfiguration nachlesen, was beim Einsatz von set_time_limit() zu beachten ist.
Lo!
Yow?!
[0] Es sei denn, du siehst "... jedoch kam es dann zu einer Zeitüberschreitung" als eindeutiges Indiz dafür, dass PHP nicht im Kommandozeilenmodus und damit zwingend bei einem Webhoster ausgeführt wird.
MffG
EisFuX