Ankündigung

Einklappen
Keine Ankündigung bisher.

Speicherlimit und Variablen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Speicherlimit und Variablen

    Hi,

    hab ein Script, dass eine Datei Zeile für Zeile parst, das Apache-Log-file.
    Tut auch erstmal ganz brav seinen Dienst.
    Aber so ein Logfile bekommt schnell mal ne unhandliche Größe.
    53MB in 190.000 Zeilen meinem Fall.

    An und für sich lauft es so ab dass ich in einer Schleife die Zeilen abarbeite.

    while ($line = fgets($fp)) {
    $einCounter++;
    $hilfsvariable = null;
    tuWasMit($line);
    }

    Alle Variablen werden am Anfang der Schleife werden auf ihren Ursprungswert zurückgesetzt, damit die nächste Zeile bearbeitet werden kann.

    Warum will das Script irgendwan über ein GB Ram haben?
    Muß ich den Speicher von Variablen explizit freigeben?

    Bisher dachte ich das zB
    $line = 'zeile 1'; eben ihren Speicher hat und wenn ich
    $line = 'zeile 2'; mache eben der Speicher für den nächsten Inhalt verwendet wird und zusätzlich allockiert wird.

    Und bisher dachte ich auch, wenn ich zB ein Object
    $object = new ObjectClass($daten);
    habe, dass der Speicher frei wird und neuer verwendet wird, wenn ich erneut
    $object = new ObjectClass($neueDaten);
    angebe.

    Vieleicht kann mir jemand erklären, wei ich das Speichermanagement ein wenig kontrollieren kann, denn in der Suche, über Google und den üblichen Handbüchern bin ich nicht fündig geworden.

    Gruß
    Der Desian
    Wenn dich was ankotzt, machs besser.

  • #2
    Aber so ein Logfile bekommt schnell mal ne unhandliche Größe.
    Naja, man kann es ja auch ab und zu mal löschen, wenn man es sich angeschaut und/oder überprüft hat
    Oder willste das Log-File die nächsten 5 Jahre noch aufbewahren ?

    Kommentar


    • #3
      wäre es nicht auch einfacher die werte in einer datenbank zu speichern und da abzurufen?

      geht bestimmt schneller!

      und wenns nicht viele tabellen sind und meiß nur lesetugriffe und die zeilenzahl relativ gerin (<500k) kanste sqLigth nehmen

      Kommentar


      • #4
        Oder das Log-File Stückweise auslesen ... also nicht alles auf einmal.

        Kommentar


        • #5
          Öhm...

          Also:
          Um das 'in eine Datenbank bringen' geht es. Das genau soll diese Script tun.
          Es soll halt ausgewertet werden, nachdem ich elebente der einzelnen Zeilen in eine DB gebrahcht hab.

          Desweiteren:
          Täglich wird ein solches Logfile ausgelesen und dann gelöscht, ja.

          Und:
          Das Stück für Stück, also Zeile für Zeile.
          Das war mein Plan.

          Danke erstmal für die Hinweise, nur zur dierekten Frage:
          Wie kontrolliere ich meinen Speicher?
          bringen die mir noch nix....

          Gruß
          Der Desian
          Wenn dich was ankotzt, machs besser.

          Kommentar


          • #6
            Das Problem mit PHP und Speicher ist die Fragmentierung. Wenn Du in einen String was neues reinschreibst, was grösser ist als das, was vorher drinstand, sucht sich PHP ne freie Speicherstelle, in die das neue am Stück reinpasst, und behält das alte Stück speicher, obwohl nichts mehr drinsteht, da es ja zwischen benutztem Speicher liegt.

            Kontrollieren kann man das nicht wirklich, aber Du kannst ein vollständiges, minimales Script posten, welches den Fehler reproduziert.
            mod = master of disaster

            Kommentar


            • #7
              Es ist leider kein Fehler in dem Sinne.
              Es wird halt immer nur mehr Speicher.

              Wenn ich ein verkürztes Script reinschmeiße, ist vermutlich das interesante nicht dabei.

              Wird 'unset()' den Speicher freigeben?
              zb.
              unset($line); mach ich schon und das bei einigen andern, die immer wieder neu befüllt werden.
              Hilft das überhaupt was?
              Ich hab leider an der Stelle von PHP so gar keine Ahnung...

              Gruß
              der Desian
              Wenn dich was ankotzt, machs besser.

              Kommentar


              • #8
                Zitat von DerDesian
                Wenn ich ein verkürztes Script reinschmeiße, ist vermutlich das interesante nicht dabei.
                Wenn das verkürzte Script gigabyteweise Speicher verbraucht, wird das interessante schon dabei sein.

                Zitat von DerDesian
                Wird 'unset()' den Speicher freigeben?
                Kommt drauf an, was Du unter "freigeben" verstehst. Der Speicher wird noch PHP gehören, aber es wird keine Variable mehr drinstehen.
                mod = master of disaster

                Kommentar


                • #9
                  Das Script ist in ein Framework eingebettet, dh. es wird nix nützen, da jede Menge andere Funktionen und Klassen mitbenutzt werden.
                  Es würde hier einfach den Rahmen sprengen.
                  Ein kleines Script, was diese SpeicherMengen frisst, habe ich nciht reproduzieren können. Ich weiß eben nicht woran es liegt, deshalb brauche ich Hinweise, wonach ich suchen muß.

                  Ich muß hinter das Prinzip, nicht nur eine Einzellösung finden.

                  Unter 'Freigeben' verstehe ich 'Für andere Zwecke wieder verwendbar.'
                  Also, wenn cih eine neue Variable anlege, dass eben dieser Speicher wieder dafür verwendet wird, nicht neuer.
                  Wenn dich was ankotzt, machs besser.

                  Kommentar


                  • #10
                    Dann würde ich den Fehler im Framework suchen.
                    Kann gut sein, dass die Objekte das Problem sind. Wenn alle Referenzen auf ein Objekt zerstört sind, sollte das Objekt eigentlich vom GC weggesammelt werden.
                    Kann natürlich theoretisch auch sein, dass Du nen Bug in PHP entdeckt hast, wenn man so was automagisches hat wie nen Garbage Collector ist das, was dahinter passiert, halt immer etwas intransparent.

                    Ich würd vielleicht mal hiermit ans Debugging gehen:
                    http://de3.php.net/manual/en/functio...-get-usage.php
                    Damit solltest Du rausfinden können, wo der Speicher verbraten wird. Nen richtigen Memory-Profiler für PHP hab ich zumindest nicht gefunden. Vielleicht liesse sich sowas über Backticks selber bauen... vielleicht.
                    mod = master of disaster

                    Kommentar


                    • #11
                      Das Problem mit PHP und Speicher ist die Fragmentierung. Wenn Du in einen String was neues reinschreibst, was grösser ist als das, was vorher drinstand, sucht sich PHP ne freie Speicherstelle, in die das neue am Stück reinpasst, und behält das alte Stück speicher, obwohl nichts mehr drinsteht, da es ja zwischen benutztem Speicher liegt.
                      dann lad doch am anfang nen 4096 byte langen string rein, da alle anderen dann wahrscheinlich kürzer sind sollte der den beibehalten oder ?
                      keine

                      Kommentar

                      Lädt...
                      X