Autor Zpráva
nicmund
Profil
Zdravím, potřeboval bych poradit s importem do databáze přes PHP.

Pomocí php scriptu postupně načítám xml s daty a ukládám do mySQL databáze. Script zadává tisíce mysql_query("INSERT...")...
U větších importů je ale problém. Zaplní se RAM (800MB) a po chvíli DB spadne. Co s tím? Proč se tak moc zaplňuje paměť? Jde nějak průběžně "čistit", případně nějak nastavit DB? Pomohla by například funkce sleep() mezi dotazy (samozdřejmě za předpokladu, že by se import prováděl pomaleji)? Předem děkuji za Vaše odpovědi.
Joker
Profil
nicmund:
A jak vypadá ta část skriptu, která čte data a ukládá je do DB?
nicmund
Profil
  $xml = "http://www...........";
  $reader = new XMLReader();
  $reader->open($xml);
  $pocet = 0;
  while($reader->read()) {
    if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'SHOPITEM') {
      $shopitem = @$reader->expand();
      if ($shopitem != "") {
        $doc = new DOMDocument('1.0', 'UTF-8');
        $v = simplexml_import_dom($doc->importNode($shopitem,true));
        $url = trim($v->URL);
        //další proměnné
        mysql_query("INSERT INTO ...");
      }
    }
  }
Kajman
Profil
Zlepší se to, když třeba po každých 100 záznamech zavoláte commit?
candiess
Profil
nicmund:
a proč neuděláš jeden velký dotaz přes spojování proměnných?
$query = "INSERT INTO table VALUES";
//cyklus while bude mít místo tvého mysql query pouze 
$query .= "(hodnoty)";

a pak za while tento dotaz odešleš, přes cyklus while posílat pokaždé dotaz je celkem hodně náročné, nemyslíš?
nicmund
Profil
Zkusil jsem odesílat bloky po 10000 záznamech, mezi které jsem použil funkci sleep(), bohužel bez většího efektu. Při 100k záznamech se zaplní RAM a DB spadne..

EDIT: Tak nakonec jsem to vyřešil jedním velkým dotazem jak radil candiess. Jen jsem musel navýšit hodnotu max_allowed_packet.
juriad
Profil
použij LOAD DATA INFILE, viz http://www.linuxsoft.cz/article.php?id_article=408

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: