SimpleXMLElement nagy adatmennyiségre

SimpleXMLElement nagy adatmennyiségre
2014-05-28T00:17:04+02:00
2014-05-28T09:08:03+02:00
2022-12-01T03:25:45+01:00
thetester
Hello!!

Van egy 150.000 tételből álló adatbázisom, amit meg szeretnék jeleníteni egy weboldalban XML formátumban.

1000 tételig jó, de ilyen nagy mennyiségnél nem működik.. Mit kell módosítani rajt?!
...
$xml = new SimpleXMLElement("<?xml version="1.0" encoding="utf-8" ?><lista></lista>"); for($i=0;$i<80000;$i++) { $eredm[] = sqlsrv_fetch_array($lekeres); $track = $xml->addChild('adatlista'); $track->addChild('partnerid', iconv('ISO-8859-2', 'UTF-8', $eredm[$i]['unev'])); $track->addChild('partnerid', iconv('ISO-8859-2', 'UTF-8', $eredm[$i]['ucim'])); $track->addChild('partnerid', iconv('ISO-8859-2', 'UTF-8', $eredm[$i]['utel'])); } header('Content-Type: text/xml; charset=utf-8'); ob_start(); print($xml->asXML()); ob_end_flush();

Köszönöm!!
TheTester'
Mutasd a teljes hozzászólást!
Próbáld ki ezt a gistet és a limittel látod ,hogy mennyi memóriát és mennyi idő alatt használt el a folyamat, a test.xml -be pedig megnézheted ,hogy mennyi adatot sikerült leírni mielőtt összeomlik a rendszer.



Írd le ,hogy 1000 nél és 10.000 nél milyen értékeket kaptál.





hisorange/xml probléma
Mutasd a teljes hozzászólást!

  • Ekkora adatmennyiségnél vagy időtúllépésbe futsz vagy megtelik a memória, mivel nem írtad ,hogy pontosan mely okból így csak találgatni tudok. Viszont van több megoldás is, ha ezt a folyamatot nem végzed el túl sokszor vagy nem probléma az IO túlterhelése akkor indítsd el egy nagyobb memória limittel és egy maximálisan memória korláttal.

    ini_set('max_execution_time', 0);
    ini_set('memory_limit', '6G'); // vagy amennyi szükséges nem tudom milyen adatot akarsz exportálni.
    Használhatod a consolt is ,hogy dumpold az adatbázist és azt egy regexpel átalakítod ami jóval komplikáltabb de sokkal gyorsabb.



    Vagy ahogy a legtöbb megoldást láttam erre limittel, mindig csak 1000 bejegyzést ír be majd frissíti a feldolgozást és a csinálja a következő 1000 bejegyzést, ez elég gyors és könnyen kivitelezhető.



    (Nem tudom pontosan milyen környezetbe kerül a script végrehajtásra de ha lehetséges akkor írasd ki az eredményt egy fájlba és csak akkor frissítsd ha szükséges mert egy ekkora lekérés a php-nak hatalmas munka mégha minden sorba csak egy 1 es van)
    Mutasd a teljes hozzászólást!
  • Találtam olyat is, hogy pl 1000-es tételenként flush-olni kellene..
    Ebben az esetben az hogy nézne ki??!

    Az a gond, hogy böngészőben lekérem, és egy ideig karikázik, de semmilyen adat nem jelenik meg.. Beállítom, hogy 1000 tétel jelenjen meg, akkor megy egy ideig és megjeleníti az XML-t.

    Köszönöm,
    TheTester'
    Mutasd a teljes hozzászólást!
  • ob_flush(); és látod ,hogy áll az adat feldolgozás. Ez annyit segít ,hogy a buffer nem telik meg, viszont az objectum amivel dolgozol ettől még óriási méretet fog ölteni.



    Mennyi adatot passzolsz soronként a SimpleXML-nek?
    Mutasd a teljes hozzászólást!
  • Egy-egy XML child 10 soros...

    De az én esetemben hogyan néz ki 1000 soronként egy ob_flush() ?
    Mutasd a teljes hozzászólást!
  • if( ! ($i % 1000)) ob_flush();
    Mutasd a teljes hozzászólást!
  • akkor is működik, ha a egy $XML be rakok mindent??! és a végén iratom ki??!
    Mutasd a teljes hozzászólást!
  • Próbáld ki ezt a gistet és a limittel látod ,hogy mennyi memóriát és mennyi idő alatt használt el a folyamat, a test.xml -be pedig megnézheted ,hogy mennyi adatot sikerült leírni mielőtt összeomlik a rendszer.



    Írd le ,hogy 1000 nél és 10.000 nél milyen értékeket kaptál.





    hisorange/xml probléma
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd