Hirnknoten für Auswertung

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

  • Hirnknoten für Auswertung

    Hallo zusammen,

    ich habe ein kleines Problem beim schreiben eines Skriptes, wobei mir der Denkansatz fehlt und weniger das technische dazu... Vielleicht könnt Ihr mir helfen, bin sehr dankbar für jede Idee.

    Das Problem stellt sich wie folgt da:

    Ich habe eine CSV mit ca. 20000 Zeilen, in denen die Angaben Uhrzeit, Modul Nummer, Start/Ende und der Benutzer drin steht. Das ist eine Logfile aus unserer WaWi, die aufzeichnet welcher Nutzer welches Modul startet. Ich muss jetzt irgendwie auswerten, wieviele Nutzer GLEICHZEITIG in den einzelnen Modulen waren, um für unser neues ERP die Lizenzberechnung durchzuführen, da die leider Modulweise lizenzieren. Kleines Beispiel zum Verständnis: User A Start Modul K110 um 6:55, User B Start 7:02 und User C 8:30. User A Ende Modul K110 aber schon 8:10, bedeutet das ich maximal 2 gleichzeitige Nutzer hatte.
    Mir fehlt irgendwo der Denkansatz um diese einzelnen Einträge zu differenzieren.

    Besten Dank im voraus für jeden Tipp.
    Gruß,

    Lars
    Zuletzt geändert von lars-th; 18.07.2008, 12:42.

  • #2
    Das ist allerdings ein guter Hirnknoten....

    also auf die Schnelle fällt mir da nur folgene (halbwegs) Vernünftige Lösung ein:

    Du ließt alle Daten aus der CSV-Datei aus und speicherst alles in eine (temporäre) SQL-Tabelle.

    Dann gehst du alle Datensätze durch und überprüfst bei jedem Start, wie viele zu diesem Zeitpunkt denn zu diesem Zeitpunkt in diesem Modul waren. Ist dieser Wert größer dem, den du schon vorher als größten Wert ermittelt hast, so speicherst du diesen Wert.

    Und dann halt immer so weiter......

    Zum schluss hast du dann für jedes Modul den höchsten Wert.
    signed oder unsigned... das ist hier die Frage

    Kommentar


    • #3
      in ein array lesen

      - name
      - von
      - bis

      dann vergleichen und du hast ein ergebnis
      Signatur-Text ...

      Kommentar


      • #4
        Naja, "mal eben so" ist das sicher nicht gemacht, aber wenn du ein wenig nachdenkst, kommst du ganz fix auf eine Lösung. Ganz primitiv könntest du zum Beispiel ein Array aufbauen, welches als Schlüssel den Zeitwert einer Minute enthält. Nun gehst du deine Daten durch und trägst jeden Benutzer in den aktiven Minuten ein. Dann das Array durch gehen und du hast die maximal gleichzeitig aktiven User.
        Das wird bei 20000 Zeilen natürlich viel zu Speicheraufwendig, aber so als Denkansatz für's vorgehen.

        Kommentar


        • #5
          Mal angenommen, eine Zeile des Logfiles ist durchschnittlich 4096 Bytes. Dann ist das ganze Logfile ca. 80 MB. Der Standardwert für memoy_limit ist 128 MB, da ist also noch gut Luft.

          Zur Not könntest du das Logfile erstmal nach Modul sortieren. Das geht mit wenig Speicher (Bubblesort). Danach kannst du das File portionsweise verarbeiten, Modul für Modul. Das hat natürlich keinen Zweck, wenn 99% der Logeinträge zum selben Modul sind.

          Um es weiterzuspinnen: Nach dem Sortieren nach Modul kannst du noch ein zweites Mal durchgehen und jeden Modulabschnitt nach Loginzeit sortieren. Das geht selbstverständlich auch mit minimalem Speicherverbrauch - analog zur Modulsortierung.

          Wenn Speicher kein Problem ist, würde ich das selbe machen, Sortieren nach Modul und Loginzeit, aber halt per file() und usort().

          Im Rest dieses Beitrags gehe ich davon aus, dass die Logeinträge modulweise verarbeitet werden. Erst alle Einträge zu Modul a, dann alle zu Modul b und so weiter.

          Iteriere über die Einträge und halte dabei zwei Werte, $user und $max_user.
          Bei jedem Login wird $user um eins erhöht, bei Logout um 1 verringert. In jeder Iteration wird $max_user auf $user gesetzt, wenn $user größer als $max_user ist. Etwa so:
          PHP-Code:
          $user 0;
          $max_user 0;
          foreach (
          $lines as $l) {
              if (
          isLogin($l)) $user++;
              elseif (
          isLogout($l) && $user 0$user--;
              if (
          $user $max_user$max_user $user;

          Kommentar


          • #6
            Tschuldigung wenn ich das Thema jetzt pushe, aber wollte mich für die Hilfe bedanken, hat dann super geklappt

            Kommentar

            Lädt...
            X