Portál AbcLinuxu, 26. dubna 2024 14:02


Dotaz: Problém s pamětí u XSLT

7.1.2013 12:29 jeleniste | skóre: 13 | blog: Prokustovo lože
Problém s pamětí u XSLT
Přečteno: 349×
Odpovědět | Admin
Mám problém s xslt transformací velkýho xml. Zkoušel jsem Xalan-c a xsltproc a v obou případech mě to sežralo ramku (6 Gb) a pak to kernel vykopnul. Zkoušel jsem to naporcovat pomocí xml_split z twig tools, ale ani xalan, ani xsltproc neuměj ty includovaný fajly (nebo jim já neumim říct, jak s nima naložit). Já bych, ideálně potřeboval z toho xml nadělat samostatný porce, aby ale každá byla samostatně životaschopná. Jde to? Je na to nějaká finta?
Nejsem blbý, jen se hloupě ptám
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.1.2013 13:18 Kit
Rozbalit Rozbalit vše Re: Problém s pamětí u XSLT
Odpovědět | | Sbalit | Link | Blokovat | Admin
SAXem by to mělo jít.
7.1.2013 13:29 jeleniste | skóre: 13 | blog: Prokustovo lože
Rozbalit Rozbalit vše Re: Problém s pamětí u XSLT
Sax jasný. A co si mam nainstalovat/vygůglit? Mam už udělaný ty stylesheety, fungujou na menších fajlech, nerad byc to dělal znova. Dá se to nějak použít jako command line utilita?
Nejsem blbý, jen se hloupě ptám
9.1.2013 20:57 jeleniste | skóre: 13 | blog: Prokustovo lože
Rozbalit Rozbalit vše Re: Problém s pamětí u XSLT
Hm, tohle nejde. Dělám to blbě?
jelen@gentoo ~/Dropbox/$ java -jar /usr/share/saxon-9/lib/saxon.jar dta_pha/20121231_OB_554782_UKSH.xml vymenny_format.xsl > inserty_pha.sql
Warning: at xsl:stylesheet on line 2 column 1473 of vymenny_format.xsl:
  Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at net.sf.saxon.tinytree.TinyTree.ensureNodeCapacity(Unknown Source)
        at net.sf.saxon.tinytree.TinyTree.addNode(Unknown Source)
        at net.sf.saxon.tinytree.TinyBuilder.makeTextNode(Unknown Source)
        at net.sf.saxon.tinytree.TinyBuilder.characters(Unknown Source)
        at net.sf.saxon.event.Stripper.characters(Unknown Source)
        at net.sf.saxon.event.ReceivingContentHandler.flush(Unknown Source)
        at net.sf.saxon.event.ReceivingContentHandler.endElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:604)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1759)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2915)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:625)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:819)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:748)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
        at net.sf.saxon.event.Sender.sendSAXSource(Unknown Source)
        at net.sf.saxon.event.Sender.send(Unknown Source)
        at net.sf.saxon.Controller.transform(Unknown Source)
        at net.sf.saxon.Transform.processFile(Unknown Source)
        at net.sf.saxon.Transform.doTransform(Unknown Source)
        at net.sf.saxon.Transform.main(Unknown Source)
Nejsem blbý, jen se hloupě ptám
10.1.2013 10:53 Kit
Rozbalit Rozbalit vše Re: Problém s pamětí u XSLT
Saxon není SAX.
10.1.2013 10:06 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Problém s pamětí u XSLT
Odpovědět | | Sbalit | Link | Blokovat | Admin

Ahoj.

Zpracovavam "jen" zakladni sadu dat (soubory _UZSZ.xml), ale xsltproc u me (4 GB RAM) taky neprosel. Pouzivam Xalan a projde mi i soubor pro Prahu. Spoustim to z PHP skriptu pomoci exec a vystup ctu primo zpatky do skriptu.

Na Fedore 16 (moje pracovni stanice, na ni delam import uplnych dat)

$s = exec("Xalan \"".$ZdrojovyXMLsoubor."\" \"".$XSLTSablona."\"", $VystupniData);

Na Debianu (virtualni server, delam jen updaty)

$s = exec("xalan -in \"".$ZdrojovyXMLsoubor."\" -xsl \"".$XSLTSablona."\"", $VystupniData);

Ve skriptu pak pracuji s $VystupniData.

Napadlo me rozdelit sablonu do nekolika kroku, transformovat to postupne (na nekolik pruchodu) a do db to vkladat postupne (pri prvnim pruchodu insert, pri dalsich update podle kodu prvku).

Dejf

Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
10.1.2013 13:45 Filip Jirsák
Rozbalit Rozbalit vše Re: Problém s pamětí u XSLT
Odpovědět | | Sbalit | Link | Blokovat | Admin
Normálně si XSLT procesor vytvoří z XML dokumentu celý strom v paměti (buď DOM nebo podobnou strukturu), a nad tou pak pracuje. Pro opravdu velké XML to samozřejmě znamená enormní množství potřebné paměti. Naporcování do více souborů a skládání pomocí XInclude by vám nepomohlo, to skládání do jednoho dokumentu dělá parser a zase byste skončil s jedním obřím stromem v paměti.

XSLT je ale záměrně navržené tak, aby se dalo používat i proudově, tj. postupně se při parsování XML rovnou aplikuje transformace a není nutné držet moc velkou část XML stromu v paměti. (Ta možnost proudového zpracování je taky důvod, proč XSLT vypadá tak divně a neintuitivně.) Samozřejmě je k tomu potřeba mít dobře navrženou XSLT šablonu, které to proudové zpracování umožní – nebude se odkazovat napříč dokumentem a pomocí absolutních cest, ale bude používat opravdu jen nejnutnější část zpracovávaného dokumentu.

Pak je taky samozřejmě potřeba podpora na straně XSLT procesoru. Podporuje to Saxon EE (alespoň to tvrdí na webu, já verzi EE nikdy nezkoušel). O jiné implementaci nevím, na druhou stranu něco lepšího než Saxon těžko seženete (pokud ano, určitě dejte vědět).
10.1.2013 14:38 Kit
Rozbalit Rozbalit vše Re: Problém s pamětí u XSLT
Odpovědět | | Sbalit | Link | Blokovat | Admin
Stačilo chvilku hledat a našel jsem JOOST, XML::STX (Perl), STXPath a XStream. Tak si vyber.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.