Autor | Zpráva | ||
---|---|---|---|
nicmund Profil |
#1 · Zasláno: 3. 8. 2012, 13:01:15
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 |
#2 · Zasláno: 3. 8. 2012, 13:09:04
nicmund:
A jak vypadá ta část skriptu, která čte data a ukládá je do DB? |
||
nicmund Profil |
#3 · Zasláno: 3. 8. 2012, 13:21:18
$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 |
#4 · Zasláno: 3. 8. 2012, 13:31:16
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 |
#7 · Zasláno: 4. 8. 2012, 17:02:10
použij LOAD DATA INFILE, viz http://www.linuxsoft.cz/article.php?id_article=408
|
||
Časová prodleva: 13 let
|
0