Ankündigung

Einklappen
Keine Ankündigung bisher.

hohe CPU Belastung - keine Leistung

Einklappen

Neue Werbung 2019

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

  • hohe CPU Belastung - keine Leistung

    Hallo!

    ich versuche, eine ca 40 MByte große Datei, die SQL Kommandos enthält, in eine Datenbank zu lesen. Dabei stelle ich fest, dass ca 2000 Zeilen der Datei gelesen werden, danach sich aber php aufhängt, d.h. 100% CPU Last, aber keine Veränderung in der Datenbank.

    Bei ca 3000 SQL Befehlen geht alles ok, bei ca 3100 SQL Befehlen kommt es zu dem "Aufhängen". An den SQL Befehlen selber scheint es nicht zu liegen, 1. es kommt zu keinem Aufhängen, wenn ich die 3100 SQL Befehle in 2 Gruppen durchschicke, und 2. alle SQL Befehle werden fehlerlos abgearbeitet.

    Hat irgendjemand einen Tipp?

    Gruss Bruno

    p.s. Füttern von PHPMYADMIN, dort SQL führt zu dem gleichen Verhalten, wobei das Aufhängen bei ca 1400 Datensätzen stattfindet.


    set_time_limit(0);

    $b = fgets($handle, 4096);
    if(substr($b,0,1)<>"#"){$buffer.=$b;}
    $pos=strpos($buffer,";");
    $len=strlen($buffer);

    if($pos +1 == $len ){
    if (strlen($buffer)>0){

    $result = mysql_query($buffer);
    if (!$result) {
    die('Invalid query: ' . mysql_error());
    echo "<hr>$buffer

    ".mysql_error()."<hr>";
    }
    }
    $buffer="";
    }
    }

  • #2
    nur als kleiner tipp:
    Code:
    INSERT INTO a (b,c) VALUES 
    (1,2),
    (3,4),
    (5,6)
    ist äquivalent zu
    Code:
    INSERT INTO a (b,c) VALUES (1,2);
    INSERT INTO a (b,c) VALUES (3,4);
    INSERT INTO a (b,c) VALUES (5,6);
    führt aber zu einem extremen performancegewinn.
    wenn du also die möglichkeit hast, die sql-befehle gleich so einzutragen, solltest du selbst 30.000 inserts locker reinbekommen.

    natürlich hängt sich mysql irgendwann auf - denn nach jedem INSERT muss der tabellen-index aktualisiert werden. der aufwand dafür steigt exponenziell.
    wenn du die INSERTS nach der ersten methode machst, wird der index nur ein einziges mal aktualisiert.

    und falls du das aus welchem grund auch immer nicht gebacken bekommst, hilft mysqldump von der kommandozeile.

    und falls das auch nicht funktioniert, bleibt dir nichts anderes übrig, als das ganze häppchenweise in die datenbank zu packen.

    Kommentar


    • #3
      dann ist es eigendlcih am besten, du machst es über die CommanLine.
      Also den mySQL-Client starten und
      sourche [pfad]/[datei] angeben. Dann braucht PHP kein 40MB-File zu laden.
      PHP is für grße Dateien nur bedingt geeignet.

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

      Kommentar

      Lädt...
      X