Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Import ogromnog XML-a u MySQL

[es] :: PHP :: Import ogromnog XML-a u MySQL

[ Pregleda: 1519 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

gotivac
Kragujevac

Član broj: 26754
Poruke: 160
*.static.sbb.rs.



+2 Profil

icon Import ogromnog XML-a u MySQL23.10.2012. u 10:55 - pre 139 meseci
Imam jedan problem koji umem da rešim, ali rešenje koje mi je palo na pamet radi previše sporo.
Radi se o aplikaciji koja se vrti na standardnoj LAMP konfiguraciji, i za koju je potrebno napraviti modul preko koga će korisnik jednom sedmično učitavati veliki xml fajl - radi se o tabeli osiguranika RFZO.

XML fajl ima sledeću strukturu:

Code:

<?xml version="1.0" encoding="windows-1250"?>
<Osiguranici>
<Osiguranik>
  <Filijala><![CDATA[ *******]]></Filijala>
  <Ispostava><![CDATA[ *******]]></Ispostava>
  <LBO><![CDATA[*******]]></LBO>
  <BrojKnjizice><![CDATA[*******]]></BrojKnjizice>
  <JMBG><![CDATA[*******]]></JMBG>
  <Prezime><![CDATA[*******]]></Prezime>
  <Ime><![CDATA[*******]]></Ime>
  <OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja>
</Osiguranik>
<Osiguranik>
  <Filijala><![CDATA[ *******]]></Filijala>
  <Ispostava><![CDATA[ *******]]></Ispostava>
  <LBO><![CDATA[*******]]></LBO>
  <BrojKnjizice><![CDATA[*******]]></BrojKnjizice>
  <JMBG><![CDATA[*******]]></JMBG>
  <Prezime><![CDATA[*******]]></Prezime>
  <Ime><![CDATA[*******]]></Ime>
  <OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja>
</Osiguranik>

... i tako dalje...

</Osiguranici>


(Zvezdice su naravno umesto pravih podataka osiguranika).

Pokušao sam ovo da rešim na dva načina - prvi je uz pomoć samog MySQL-a, to jest komande LOAD XML INFILE ... ali to neće da radi zbog ovih CDATA gluposti.

Drugi način koji radi bez problema je preko simplexml_load_file, ali tu sad nastaje frka.
Nisam hteo da čitam slog po slog pa da ga upisujem u bazu, jer bi to za 300000 slogova bilo isto toliko INSERT INTO komandi, pa sam pokušao da pravim jedan string, nešto ovako:

Code:

$sql = 'INSERT INTO insured (branch, substation, insurance_number, insurance_card, citizen_number, name, surname, insurance_basis) VALUES ';
    
    $xml=simplexml_load_file('KR.xml');
    foreach ($xml->children() as $osiguranik)
    {
        $sql .= '(';
        foreach($osiguranik as $row)
        {
            $sql .= "'$row', ";
        }
        $sql = substr($sql,0,-2) . '), ';
    }  
    $sql = substr($sql,0,-2);
    $db->sql = $sql;
    $db->exec();


Mislim da ovo radi - ne mogu sa sigurnošću da tvrdim jer sam ga pustio pre otprilike 50 minuta i još uvek nije završio. :D

Ima li neko ideju kako ovo može da se odradi brže?
 
Odgovor na temu

Nemke_BG

Član broj: 163822
Poruke: 341
*.static.sbb.rs.

Jabber: Nemke_BG@elitesecurity.org
Sajt: https://www.nmdesign.rs


+45 Profil

icon Re: Import ogromnog XML-a u MySQL24.10.2012. u 11:13 - pre 139 meseci
Poslednje resenje koje si pomenuo je pravo, samo ne preteruj nego napravi na primer 30 inserta koji ubacuju 10 K redova, ili 300 x 1 K, cisto da moze da ti server dise, mozda cak i stavis sleep(5) izmedju iteracija da smanjis load, ako ti nije problem da malo vise sacekas. Ako krenes ovo da radis obavezno pre inserta onemoguci sve indekse, a posle zavrsenog inserta ih vrati, posto mysql reindeksira posle svakog inserta.
...
 
Odgovor na temu

gotivac
Kragujevac

Član broj: 26754
Poruke: 160
*.dynamic.sbb.rs.



+2 Profil

icon Re: Import ogromnog XML-a u MySQL24.10.2012. u 22:58 - pre 139 meseci
Hvala na odgovoru, ovako sam i uradio, dva sata nakon što sam ovde napisao pitanje.

Pokušao sam sa 10.000 slogova, ali nije išlo jer je dužina sql stringa prelazila default ograničenje od 1MB (može da se promeni u my.ini-ju, ali nisam hteo da preterujem), pa je MySQL server zakucavao, smanjio sam na 5.000 i radi odlično, nema potrebe za sleep-om, jer MySQL taman "odmori" dok PHP izparsuje narednih 5.000. :)
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Import ogromnog XML-a u MySQL25.10.2012. u 12:01 - pre 139 meseci
Ako koristis innodb table obavezno raditi import sa transakcijama.
Tko leti vrijedi
 
Odgovor na temu

[es] :: PHP :: Import ogromnog XML-a u MySQL

[ Pregleda: 1519 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.