date() performancekiller ?

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

  • date() performancekiller ?

    hi leute,

    ich hab da ein mächtiges performanceproblem und würde das gerne beheben.

    ich hab in einer schleife ein INSERT statement, dass derzeit testweise 200 einträge vornimmt... es werden später aber mal ca 6000 sein müssen.
    Die Daten kommen aus einer CSV Datei

    nun hab ich 2 werte aus der CSV mit der ich ein datum berechnen muss und das soll zusätzlich mit in die datenbank.
    Der eine wert ist normales Datumsformat dd.mm.yyyy
    der zweite werte stellt stunden dar, die dem Datum die Stundenangabe verleihen. Die Stundenwerte werden in 100er werten dargestellt
    ( 100 ist: +1 Std, 200 ist: +2Std usw)

    hier der php-code aus der schleife:
    PHP-Code:
    // 31.01.2009 10:00 Beispiel für $DATE
    $plus $stdValue*36;
    $dateTimestamp  strtotime($DATE);
    $utc_date date("d.m.Y H"$dateTimestamp $plus ); 
    wenn ich diesen verwende brauch das script bis zu 10 mal länger, als ohne diese Umrechnung..

    gibt es eine Möglichkeit mein Vorhaben anders zu realisieren?
    Coder never die, they just GOSUB without RETURN

    Mein System

  • #2
    Hallo ways,

    ich vermute (nicht getestet), dass strtotime wegen seiner fast schon magischen Funktionalität recht teuer ist. Alternativ zur Berechnung in PHP könntest du doch der Datenbank das alles gleich als String mit str_to_date vor die Füße schmeißen und dafür das Format explizit angeben. Dann kümmert die sich selbst drum.

    Gruß,

    Anja
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      das strtotime() kostet mich ca 50% der ausführungszeit.

      ich kann das strtotime noch aus der schleife nehmen, weilich den ersten Datumstring ( z.b 20.01.2009 10:00 Uhr ) kenne...
      aber weil ich ja dann die stunden hinzurechnen muss, brauch ich aus meinen augen das date() in der schleife, weil ich ja da erst die daten für die stunden erhalte.

      Varianten:
      1. mit strtotime() und date() in der schleife = 15.8 sek.
      2. nur date() in der schleife nur noch 8,88 Sek Sek
      3. die komplette Datumsbrechnung entfernt 1,5 Sek

      das bezieht sich auf ca. 200 Inserts, wenn ich aber 6000 Inserts durchführe würde das script sagenhafte 8 Minuten benötige bei Variante 1, bei Variante 2 noch 4,5 Min. Damit wäre der Server sicher lahmgelegt. Das ganze läuft als Cronjob alle 6 Std.

      wie ich das nun mit str_to_date realisiere ist mir noch nicht ganz klar.
      ich habe den Datumstring (z.b 20.01.2009 10:00) und die stundenanzahl die bei jedem schleifendurchlauf raufgerechnet werden müßte... was ja schonmal ein Anfang ist... vielleicht fällt ja der groschen noch
      Coder never die, they just GOSUB without RETURN

      Mein System

      Kommentar


      • #4
        Z. B. so:
        PHP-Code:
        $query "insert into tabelle (datum) values (str_to_date('";
        $query .= mysql_real_escape_string($DATE "/" $stdValue);
        $query .= "', '%d.%m.%Y/%H%i'))"
        Edit: statt %H musst du evtl. %k nehmen, wenn $stdValue ohne führende Null ankommt:
        0100, 0200, ..., 2300 => %H%i
        100, 200, ..., 2300 => %k%i
        Zuletzt geändert von AmicaNoctis; 19.08.2009, 13:00.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Das kann unmöglich stimmen. 200 date() Aufrufe brauchen keine 8 Sekunden. Da hast du irgendwo einen Knoten in deinem Script.

          Kommentar


          • #6
            Zitat von h3ll Beitrag anzeigen
            Das kann unmöglich stimmen. 200 date() Aufrufe brauchen keine 8 Sekunden. Da hast du irgendwo einen Knoten in deinem Script.

            ok, das date() allein sicher nicht, aber wie oben aus dem thread zu entnehmen, lese ich CSV Files aus, (2,6MB gross).
            Aus diesem CSV filtere ich 25 Spalten für das INSERT raus, da die CSV 256 Spalten hat

            1. csv öffnen
            2. Bestimmte csv-spalten auslesen
            3a. Datumwert und Stundenanzahl zu neuem Datum berechnen lassen
            3b. Alle Spaltenwerte für INSERT String zusammensetzen

            das is schon nen längerer vorgang, das problem ist, dass der Datumstring allein über alle zeilen hinweg der gleiche bleibt nur die stunden ändern sich.
            Und genau das muss ich ändern,
            z.B original:
            wert1a = 20.01.2009
            wert1b = 10:00
            wert1c = 100
            ( = 20.01.2009 11:00)

            24 zeilen weiter und somit 24 std weiter ( pro std eine zeile )
            steht dort dann leider nicht
            wert1a = 21.01.2009
            wert1b = 10:00
            wert1c = 100

            sondern:
            wert1a = 20.01.2009
            wert1b = 10:00
            wert1c = 2400

            das Datum und die uhrzeit aus der CSV wiederholt sich also immer.
            nur das "wert1c" ändert sich....wahnsinn, aber die daten bekomme ich so und habe null einfluss drauf.
            Coder never die, they just GOSUB without RETURN

            Mein System

            Kommentar


            • #7
              Wie gesagt, ich kann mir nicht vorstellen, dass es an date() liegt. Da hats irgendwas anderes. Aber mehr weiß meine Glaskugel auch nicht.

              Kommentar


              • #8
                Zitat von ways Beitrag anzeigen
                sondern:
                wert1a = 20.01.2009
                wert1b = 10:00
                wert1c = 2400
                Achso, dann geht es mit str_to_date leider nicht so einfach, weil der nur gültige Werte erlaubt und nicht automatisch den Überlauf verrechnet. Benutzen kannst du es trotzdem, nur halt auf diese Art:
                Code:
                date_add(str_to_date('15.08.2009 10:00', '%d.%m.%Y %H:%i'), interval 24 hour)
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Hi,

                  als Alternative könntest Du Dir eine Tabelle mit den 256 Spalten anlegen, die CSV per LOAD DATA INFILE dort reinschreiben und dann mit einem INSERT...SELECT mit geeignetem SELECT-Statement die Daten aus den 25 Spalten in Deine Tabelle schieben. Danach leerst Du die große Tabelle wieder, fertig.
                  Das sollte schneller gehen, als mit PHP 6000 Zeilen durchzunudeln und 6000 einzelne INSERTs abzusetzen.

                  LG

                  Kommentar


                  • #10
                    ok, etwas licht am horizont,
                    da bei mir ja jeder eintrag eine stunden mehr, als das ausgangsdatum bedeutet, könnte ich das ganze nicht komplett kürzen mit sowas wie
                    DATE_ADD(beginn, INTERVAL 1 Hour) ?
                    Coder never die, they just GOSUB without RETURN

                    Mein System

                    Kommentar

                    Lädt...
                    X