horn: Große Daten effektiv einlesen

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?

  1. 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

  2. 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

    1. 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.

      1. 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.

        1. 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

          • Mit fread() liest du die Daten ein. Z.B. Böcke von 64KByte (Größe kannst
              angeben).
          • Nach einem Abbruch kannst du mit fseek() an eine gewünschte Stelle
              aufsetzen (Anzahl der fread()s und deren Puffergr. merken!).

          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

  3. (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

    1. 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!

      1. (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