Norbert: Berechnung beschleunigen

Hallo,

in einer Tabelle befinden sich 174.996 Records.
Nun sollen aus zwei Spaltenwerten zwei andere Spaltenwerte berechnet werden.
Da die Formel mit MySQL schlecht darstellbar ist, verwende ich PHP zum Rechnen.

Das Ganze dauert knapp 30 Minuten, da hier Winkelfunktionen bemueht werden.
Nun erinnere ich mich daran, dass es mal Bemuehungen gab UDF's auch mit PHP
zu ermoeglichen, bin aber nicht auf dem laufenden.

Weiss hier jemand mehr zu UDF's in MySQL mit PHP?

Hat jemand einen Tip, wie man solche Arbeiten zuegig abwickeln kann?

Gruss und Dank
Norbert

  1. Hallo,

    Weiss hier jemand mehr zu UDF's in MySQL mit PHP?

    das Handbuch Deiner Version und/oder Deiner bevorzugten Sprache, vielleicht im Kapitel MySQL erweitern.

    Grüße

    Vinzenz

    1. Hallo Vinzenz,

      Weiss hier jemand mehr zu UDF's in MySQL mit PHP?
      das Handbuch Deiner Version und/oder Deiner bevorzugten Sprache, vielleicht

      im Kapitel MySQL erweitern.
      und von dort hierher 26.3.4. Hinzufügen einer neuen benutzerdefinierten Funktion

      Schoen, wenn jemand weiss, wo es stehen koennte.
      <cite>
      Damit der UDF-Mechanismus funktioniert, müssen die Funktionen in C oder C++
      geschrieben sein, und Ihr Betriebssystem muss dynamisches Laden unterstützen.
      </cite>
      Ergo sind Bestrebungen MySQL auch fuer Perl und PHP zu oeffnen aufgegeben worden.
      Hinzu kommt, dass man root-Rechte und einen Compiler benoetigt, wenn ich nichts
      falsch interpretiere. Das trifft fuer mich auf keinem bekannten Zielserver zu.

      Stellt sich die Frage, wie man sonst noch das Problem loesen koennte ...

      Gruss und Dank
      Norbert

      1. yo,

        Stellt sich die Frage, wie man sonst noch das Problem loesen koennte ...

        entweder du baust dir eine funktion in mysql, die deine berechnungen durchführen kann oder aber du persistierst die prozessdaten in zwei neuen spalten, die du hinzufügst und benutzt danach trigger, um sich aktuell zu halten.

        Ilja

  2. in einer Tabelle befinden sich 174.996 Records.
    Nun sollen aus zwei Spaltenwerten zwei andere Spaltenwerte berechnet werden.
    Da die Formel mit MySQL schlecht darstellbar ist, verwende ich PHP zum Rechnen.

    Das Ganze dauert knapp 30 Minuten, da hier Winkelfunktionen bemueht werden.

    Du schreibst doch in PHP? Wenn ich in Perl 200.000 Mal sqrt()* sin() durchlaufen lasse dauert das 0.3 Sekunden, das sollte in PHP nicht viel langsamer sein.

    Was sagt den Explain zu deiner mySQL Abfrage?

    Struppi.

    1. Hallo Struppi,

      Was sagt den Explain zu deiner mySQL Abfrage?

      keine Ahnung,
      es werden ja _alle_ Daten gezogen:

      SELECT gID, xWert, yWert FROM Tabelle;

      das entstehende Array durchlaufe ich mit foreach():

      <?php  
      function von00($nord, $ost) {  
          $zw2 = cos(298.2 * tan(((doubleval($nord) / 3600) * M_PI / 180) / 297.2));  
          $zw3 = cos(0 - ((doubleval($ost) / 3600) * M_PI / 180));  
          return round(6371 * acos($zw2 * $zw3));  
      }  
        
      foreach($ERG as $AA) {  
          list($gID, $nWert, $oWert) = $AA;  
          $query = "UPDATE Tabelle SET nrdKm = ".von00($nWert,0).", ostKm = ".von00(0,$oWert)." WHERE gID = $gID";  
          $DB->get_access($query);  
      }  
      ?>
      

      Das sind dann ja immerhin 174.996 Datenbank-Zugriffe und die werden das Ganze
      etwas aufhalten, vermute ich. Deswegen hatte ich ja die Idee mit der UDF.
      Ist ja nicht nur mal "sqrt() * sin()" ... :-)

      Gruss und Dank
      Norbert

      1. Was sagt den Explain zu deiner mySQL Abfrage?
        keine Ahnung,
        es werden ja _alle_ Daten gezogen:

        Dein Problem ist nicht das "ziehen" der Daten.

        etwas aufhalten, vermute ich. Deswegen hatte ich ja die Idee mit der UDF.
        Ist ja nicht nur mal "sqrt() * sin()" ... :-)

        Letztlich willst du ja geholfen bekommen, insofern ist es natürlich toll, dass du Informationen nur Stückweise preis gibst.

        Selbst deine Berechnung dauert mit 200.000 nur 2 Sekunden. Ist aber auch nicht anders zu erwarten, was kostet ist das UPDATE und das wirst du nicht beschleunigen können.

        Struppi.

        1. Hallo Struppi,

          was kostet ist das UPDATE und das wirst du nicht beschleunigen können.

          bist Du Dir da sicher?
          INSERT wickle ich jetzt auch wesentlich schneller ab, indem ich sie zusammenfasse.
          Vielleicht geht das ja mit UPDATE irgendwie so aehnlich?
          Man muesste halt nur die Syntax kennen ... :-((

          Gruss und Dank
          Norbert