Uli: file()

Hallo,

ich habe da ein Script, das zum Speichern von Daten eine Textdatei verwendet (ein Datensatz pro Zeile, einzelne daten mit best. Trennzeichen getrennt). Beim Ausgeben von Daten wird diese Datei mit $daten_array = file("datei.dat") eingelesen und es werden einzelne Teile des Arrays ausgegeben. Das funktioniert alles sehr gut, ich mache mir nur so langsam Sorgen wegen des kompletten Einleses der Datei mit file(). Das kann doch sicher zu Serverüberlastungen führen, wenn die Datei sehr groß wird?! Ideal wäre, wenn man nur Teile der Datei einlesen könnte (also von Zeile x bis Zeile y oder so). Gibt es so eine Möglichkeit?

Ich danke Euch schon mal!
Uli

  1. Holladiewaldfee,

    Ideal wäre, wenn man nur Teile der Datei einlesen könnte (also von Zeile x bis Zeile y oder so). Gibt es so eine Möglichkeit?

    Das kannst Du mit fopen() und Zeigern erreichen, die Du auf eine bestimmte Position in der Datei setzt. Dazu mußt Du allerdings wissen, an welche Byte-Position Du den Zeiger setzen möchtest, sprich: Du solltest über die Längen der Zeilen bescheid wissen.

    Hilft das nichts, würde ich Dir raten, auf eine Datenbank auszuweichen.

    Ciao,

    Harry

    --
      Die ideale Zeit für Firntouren:
      http://harry.ilo.de/projekte/berge/
  2. Hallo Uli,

    Das kann doch sicher zu Serverüberlastungen führen, ...

    Ja, das kann es. Ist aber m. E. nicht Wert darüber nachzudenken. Bsw. eine 11-MB-große Datei ist in weniger als 0,3 sec in einem Array verschwunden. Soviele Daten wollen aber erstmal gesammelt sein ;)

    Gruß aus Berlin!
    eddi

    1. Holladiewaldfee,

      eine 11-MB-große Datei ist in weniger als 0,3 sec in einem Array verschwunden.

      Aus der php.ini, Standardkonfiguration:

      ---
      memory_limit = 8M      ; Maximum amount of memory a script may consume (8MB)
      ---

      Na, klingelts? ;)

      Ciao,

      Harry

      --
        Die ideale Zeit für Firntouren:
        http://harry.ilo.de/projekte/berge/
      1. Moin moin,

        Na, klingelts? ;)

        najaaa, man kann den Wert ja auch hochstellen.
        Beispielsweise habe ich meinem (privaten) Intranet-Server 32 MB genehmigt.

        Gruß
        Patrick

      2. Holladiewaldfee,

        Na, klingelts? ;)

        Nein - nicht die Bohne. Grade ausprobiert auf folgenden Systemen sowohl mit, als auch one ini_set()

        =========
        SunOS 5.8 Generic_108528-03 sun4u sparc SUNW,UltraSPARC-IIi-cEngine
        PHP-Version    -> 4.1.2 CGI
        Voreinstellung -> 8M

        Linux 2.4.23-ow2 #6 SMP Tue Jan 6 16:23:33 CET 2004 i686
        PHP-Version    -> 4.3.4 CGI
        Voreinstellung -> 40M

        Windows 9x EDDI 4.90                    (mein privates Schmuckstück ;)
        PHP-Version    -> 4.3.3
        Voreinstellung -> keine

        Auf allen das gleiche Ergebnis: Sie klingeln nicht :( nicht mal ein Warning

        Gruß aus Berlin!
        eddi

        1. Holladiewaldfee,

          Auf allen das gleiche Ergebnis: Sie klingeln nicht :( nicht mal ein Warning

          Also, normalerweise sollte der PHP-Interpreter stoppen, sobald ein Skript mehr als den voreingestellten Wert für den Speicherverbrauch überschreitet. Und wenn ich eine 11Mb-Datei in ein Array, das unkomprimiert gespeichert wird, einlese, dann ist das wenn ich mich nicht ganz übel verrechnet habe mehr als 8Mb ;)

          Sollte es trotzdem gehen, dann wäre das ja fast 'nen Bug-Report wert.
          Weiß irgendjemand, wie file() intern funktioniert? Liest die Funktion erst die Werte aus, wenn auf die entsprechenden Elemente des Arrays zugegriffen wird? Glaube ich nämlich nicht. Ich denke, daß das alles brav gleich beim Funktionsaufruf ausgelesen wird.

          Ciao,

          Harry

          --
            Die ideale Zeit für Firntouren:
            http://harry.ilo.de/projekte/berge/
          1. Holladiewaldfee,

            "Erfolge" zu vermelden auf dem Firmenserver:

            Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 11929027 bytes) in ~ on line 3

            memory_get_usage() zeigt auch fleißig 12088728 Byte an bei:

            <?php
            $dat=file("r_plakat_02_02_2004.tif");
            echo memory_get_usage();
            ?>

            Es kam nur zu einem Übertragungsfehler. Meinem Server daheim - der ist nicht mit --enable-memory-limit übersetzt, dem ist das dann Wurst, was ich im da mit ini_set() beibringen will. Und Deine logische Schlußfolgerung, die ich ja auch teile, ist damit bewiesen (Das Problem hat mich jetzt auch die letzten 2 h auf trapp gehalten, weil ich es mir nicht erklären konnte ;)

            Bleibt leider nur ein schwarzes Schaf übrig:

            SunOS 5.8 Generic_108528-03 sun4u sparc SUNW,UltraSPARC-IIi-cEngine
            PHP-Version    -> 4.1.2 CGI
            Voreinstellung -> 8M
            Configure Command --enable-memory-limit

            Die Datei ist 11929026 Byte groß und wird auch eingelesen mit einem Index 0 bis 1113. Das richt entweder nach einer totalen Fehlkonfiguration des Providers ...
            Oder scheint ein bug zu sein.

            Gruß aus Berlin!
            eddi

        2. Hi!

          Nein - nicht die Bohne. Grade ausprobiert auf folgenden Systemen sowohl mit, als auch one ini_set()

          Wurde PHP auf den entsprechenden Systemen auch mit "--enable-memory-limit" kompiliert?
          Siehe "Configure Command" in phpinfo().

          SunOS 5.8 Generic_108528-03 sun4u sparc SUNW,UltraSPARC-IIi-cEngine
          PHP-Version    -> 4.1.2 CGI
          Voreinstellung -> 8M

          Es kommt hierbei auch sehr auf das Script an. PHP versucht solche Dinge natürlich wo geht zu verhindern. Siehe hierzu: http://www.zend.com/zend/art/ref-count.php

          Linux 2.4.23-ow2 #6 SMP Tue Jan 6 16:23:33 CET 2004 i686
          PHP-Version    -> 4.3.4 CGI
          Voreinstellung -> 40M

          Falls obige Bedingung erfüllt ist - was sagt http://de3.php.net/memory-get-usage dazu? Natürlich reichen hier 11 MB nicht wirklich :)

          Windows 9x EDDI 4.90                    (mein privates Schmuckstück ;)

          "Schmuckstück"? ;-)

          Grüße
          Andreas

          1. Hi Andreas,

            ja - das ist mein "Schmuckstück", den ich über "alles liebe"! ;)

            Gruß aus Berlin!
            eddi

  3. Hallo und danke für Eure Antworten!

    Dann bin ich jetzt erst mal noch halbwegs beruhigt, das geht bei mir so um die 1000 Zeilen, insgesamt hat die Datei so 100-500 KB.
    Eine Datenbank kommt hier aus verschiedenen Gründen nicht in Frage.

    Uli