Programovanie

Zjednodušte spracovanie XML pomocou VTD-XML

Obrázok 3. Veľké súbory XML. Kliknutím na miniatúru zobrazíte obrázok v plnej veľkosti.

Osem rokov od svojho založenia sa XML už stalo otvoreným, pološtruktúrovaným dátovým formátom na ukladanie údajov a ich výmenu cez web. Vďaka svojej jednoduchosti a čitateľnosti pre človeka zaznamenala XML medzi vývojármi aplikácií svoju popularitu a stala sa nepostrádateľnou súčasťou podnikovej architektúry.

Aj keď je ťažké vymenovať počet spôsobov, ako sa XML používa, možno si byť istý jednou vecou: XML musí byť analyzovaný skôr, ako bude možné urobiť čokoľvek iné. V skutočnosti je výber správneho analyzátora často jedným z prvých rozhodnutí, ktoré musia podnikoví vývojári vo svojich projektoch zohľadniť. Toto rozhodnutie znovu a znovu prichádza k dvom populárnym modelom spracovania XML: Document Object Model (DOM) a Simple API for XML (SAX).

Na prvý pohľad sa príslušné silné a slabé stránky DOM a SAX javia ako komplementárne: DOM zostavuje grafy objektov v pamäti; SAX je založený na udalostiach a neukladá nič do pamäte. Takže ak je veľkosť dokumentu malá a vzor prístupu k dátam zložitý, DOM je správna cesta; inak použite SAX.

Pravda však nikdy nie je taká zjednodušujúca. Vývojári často nie sú ochotní používať SAX kvôli jeho zložitosti, ale stále to robia, pretože nie je k dispozícii iná životaschopná voľba. V opačnom prípade, ak je veľkosť súboru XML len o málo väčšia ako niekoľko stoviek kilobajtov, režijné náklady a pretiahnutie pamäte DOM sa pre vývojárov aplikácií stanú ťažkou prekážkou, ktorá im bráni splniť ciele minimálneho výkonu ich projektov.

Je však SAX skutočne o toľko lepší? Inzerovaný výkon syntaktickej analýzy SAX - zvyčajne niekoľkonásobne rýchlejší ako DOM - v skutočnosti často klame. Ukazuje sa, že nepríjemná a iba dopředná povaha syntaktickej analýzy SAX vyžaduje nielen ďalšie implementačné úsilie, ale tiež spôsobuje výkonnostné tresty, keď sa štruktúra dokumentu stane len mierne zložitou. Ak sa vývojári rozhodnú dokument neskenovať niekoľkokrát, budú musieť dokument uložiť do medzipamäte alebo vytvoriť vlastné modely objektov.

Či tak alebo onak, výkon trpí, čoho príkladom je Apache Axis. Na svojej stránke s častými otázkami Axis tvrdí, že interne používa SAX na vytvorenie výkonnejšej implementácie, napriek tomu si stále vytvára svoj vlastný objektový model, ktorý je celkom podobný modelu DOM, čo má za následok zanedbateľné zlepšenie výkonu v porovnaní s jeho predchodcom (Apache SOAP). Okrem toho SAX nefunguje dobre s XPath a vo všeobecnosti nemôže riadiť spracovanie XSLT (Extensible Stylesheet Language Transformation). Analýza SAX teda pokrýva skutočné problémy so spracovaním XML.

Hľadajúc ľahšie použiteľnú alternatívu k SAX, rastúci počet vývojárov sa obrátil na StAX (Streaming API pre XML). V porovnaní s SAX analyzátory StAX získavajú tokeny zo súborov XML namiesto použitia spätných volaní. Aj keď viditeľne zlepšujú použiteľnosť, základné problémy pretrvávajú - štýl syntaktickej analýzy StAX-u vpred si stále vyžaduje zdĺhavé implementačné úsilie a spolu s ním aj skryté náklady na výkon.

Záver: Aby bol akýkoľvek model spracovania XML všeobecne užitočný, musí obsahovať hierarchickú štruktúru XML a nič menej. Dôvodom je skutočnosť, že XML je navrhnutý na presun zložitých údajov po webe a prenos štrukturálnych informácií je neoddeliteľnou súčasťou toho, čo XML robí.

VTD-XML mení hru

Predpokladajme, že by sme mali zahájiť spracovanie XML od nuly, aby sme prekonali vyššie uvedené problémy s DOM a SAX. Nový model by pravdepodobne mal mať nasledujúce vlastnosti:

  • Náhodný prístup: Model spracovania by mal vývojárovi umožniť navigovať v akejsi hierarchickej štruktúre buď manuálne, alebo lepšie pomocou XPath.
  • Vysoký výkon: Výkon by mal byť podstatne lepší ako DOM a SAX. A výkon by mal byť „čestný“, čo znamená, že meranie musí zahŕňať čas strávený budovaním hierarchickej štruktúry.
  • Nízke využitie pamäte: Aby bol model spracovania použiteľný pre širokú škálu scenárov a veľkostí súborov, musí predstavovať úplnú štruktúru XML s minimálnym využitím pamäte.

VTD-XML je navrhnutý na splnenie týchto cieľov a je modelom otvoreného zdrojového spracovania XML novej generácie, ktorý prináša zásadné a všestranné vylepšenia oproti DOM a SAX. Jednou z kľúčových optimalizácií VTD-XML je neextrakčná tokenizácia. VTD-XML interne uchováva v pamäti neporušenú a nedekódovanú správu XML a predstavuje tokeny výlučne na základe špecifikácie binárneho kódovania s názvom V.irtual Tokien Deskriptor. Záznam VTD je 64-bitové celé číslo, ktoré kóduje dĺžku tokenu, počiatočný posun, typ a hĺbku vnorenia tokenu v XML.

Tu je trochu histórie VTD-XML, ak vás zaujíma: Základný koncept bol koncipovaný ako spôsob prenosu XML na vyhradenom hardvéri vo forme FPGA alebo ASIC, ktorý umožňuje sieťovým prepínačom a smerovačom spracovávať XML obsah pri veľmi vysokých rýchlostiach. Neskôr sa tím projektu VTD-XML rozhodol otvoriť zdrojový kód VTD-XML a prvé vydanie - verzie 0.5 a implementované v Jave - sa uskutočnilo v máji 2004. Od tohto vydania prešiel VTD-XML niekoľkými kolami vylepšení a dozrel značne. Vo verzii 0.8 bola vydaná C verzia VTD-XML spolu s verziou Java. Zabudovaná podpora XPath bola predstavená vo verzii 1.0 a bola vydaná v októbri 2005. Posledné vydanie, verzia 1.5, obsahuje prepísaný modul syntaktickej analýzy, ktorý je modulárnejší a výkonnejší.

V tomto vydaní je tiež predstavená funkcia nazývaná opätovné použitie medzipamäte. Základnou myšlienkou je, že keď aplikácia XML sediaca za sieťovým pripojením potrebuje opakovane spracovávať veľa prichádzajúcich dokumentov XML, môže skutočne znova použiť vyrovnávacie pamäte pridelené počas prvého behu spracovania. Inými slovami, prideľte vyrovnávaciu pamäť raz a použite ich mnohokrát. Táto vlastnosť, špecifická pre VTD-XML, umožňuje úplné vylúčenie tak vytvárania objektov, ako aj nákladov na odvoz odpadu (50 - 80 percent réžie v DOM a SAX) zo spracovania XML. Webová stránka projektu obsahuje najnovšie stiahnutia softvéru a podrobný technický popis VTD-XML.

Krátky príklad

Ak chcete získať prehľad o štýle programovania VTD-XML, tento článok najskôr porovnáva kód pomocou VTD-XML aj DOM na analýzu a navigáciu v jednoduchom súbore XML s názvom test.xml, ktorého textový obsah je uvedený nižšie:

  Kosačka na trávu 1 148,95 

Verzia VTD-XML vyzerá takto:

import com.ximpleware. *; import com.ximpleware.parser. *; import java.io. *;

public class use_vtd {public static void main (String [] args) {try {File f = new File ("test.xml"); FileInputStream fis = nový FileInputStream (f); byte [] ba = nový bajt [(int) f.length ()]; fis.read (ba); VTDGen vg = nový VTDGen (); vg.setDoc (ba); vg.parse (false); VTDNav vn = vg.getNav (); if (vn.matchElement ("purchaseOrder")) {System.out.println ("orderDate ==>" + vn.toString (vn.getAttrVal ("orderDate"))); if (vn.toElement (VTDNav.FIRST_CHILD, "item")) {if (vn.toElement (VTDNav.FIRST_CHILD)) {do {System.out.print (vn.toString (vn.getCurrentIndex ())); System.out.print ("==>");

System.out.println (vn.toString (vn.getText ())); } while (vn.toElement (VTDNav.NEXT_SIBLING)); }}}} catch (Výnimka e) {System.out.println ("vyskytla sa výnimka ==>" + e); }}}

Verzia DOM tej istej aplikácie je uvedená nižšie:

import java.io. *; import org.w3c.dom. *; import org.w3c. *; import javax.xml.parsers. *; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom. *; import org.xml.sax.SAXException;

public class use_dom {public static void main (String [] args) {try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); Analyzátor DocumentBuilder = factory.newDocumentBuilder (); Dokument d = parser.parse ("test.xml"); Koreň prvku = d.getDocumentElement (); if (root.getNodeName (). compareTo ("purchaseOrder") == 0) {System.out.println ("orderDate ==>" + root.getAttribute ("orderDate"));

Uzol n = root.getFirstChild (); if (n! = null) {do {if (n.getNodeType () == Node.ELEMENT_NODE && n.getNodeName (). compareTo ("item") == 0) {Node n2 = n.getFirstChild (); if (n2! = null) {do {if (n2.getNodeType () == Node.ELEMENT_NODE) ​​{System.out.println (n2.getNodeName () + "==>" + n2.getFirstChild (). getNodeValue ( )); }} while ((n2 = n2.getNextSibling ())! = null); }}} while ((n = n.getNextSibling ())! = null); }}} catch (Výnimka e) {System.out.println ("vyskytla sa výnimka ==>" + e); }}}

Ako je ilustrované v príkladoch kódu vyššie, VTD-XML naviguje v hierarchii XML pomocou rozhrania API založeného na kurzore. Naproti tomu DOM API naviguje v hierarchii požadovaním referencií na objekty. Navštívte webovú stránku projektu VTD-XML, kde nájdete ďalšie technické materiály a príklady kódov, ktoré podrobne vysvetľujú VTD-XML.

Porovnávanie VTD-XML

Ďalej porovnajme výkon a využitie pamäte VTD-XML s niektorými populárnymi analyzátormi XML. Je potrebné poznamenať, že väčšina článkov, ktoré obsahujú referenčné čísla, napríklad „Dokumenty XML za behu“ od Dennisa Sosnoského (JavaWorld, Apríl 2002), sú spred niekoľkých rokov. Odvtedy sa lepší a rýchlejší hardvér riadi Moorovým zákonom a stáva sa lacnejším než kedykoľvek predtým. Zároveň analýza XML a virtuálny stroj Java nestoja na mieste - zaznamenali vylepšenia v mnohých kľúčových oblastiach.

Vyskúšajte nastavenie

Testovacou platformou je notebook Sony VAIO vybavený procesorom Pentium M 1,7 GHz (2 MB integrovanej vyrovnávacej pamäte L2) a 512 MB DDR2 RAM. Predná zbernica je taktovaná na 400 MHz. OS je Windows XP Professional Edition s balíkom service pack 2. JVM je verzia 1.5.0_06.

Test slúži na testovanie najnovších verzií nasledujúcich analyzátorov XML:

  • Xerces DOM 2.7.1, s alebo bez odloženého rozšírenia uzla
  • Xerces SAX 2.7.1
  • Piccolo SAX 1.04
  • XPP3 1.1.3.4.O
  • VTD-XML 1.5, s alebo bez opätovného použitia medzipamäte

Pre test som vybral veľkú zbierku dokumentov XML rôznych veľkostí a štrukturálnych zložitostí. V závislosti od veľkosti súboru sú testovacie dokumenty zoskupené do troch kategórií. Malé súbory majú veľkosť menšiu ako 10 kB. Súbory strednej veľkosti sa pohybujú medzi 10 kB a 1 MB. Súbory väčšie ako 1 MB sa považujú za veľké.

Server JVM sa použil na všetky merania výkonu na získanie špičkového výkonu. V týchto testoch testovacie programy najskôr opakovane prešli syntaktickou analýzou alebo navigačnými rutinami, takže JVM vykonal dynamickú optimalizáciu bajtového kódu just-in-time a pred konečnými výsledkami spriemeroval výkon následných iterácií. Aby sa znížili variácie časovania v dôsledku vstupu / výstupu na disk, testovacie programy pred testovacím načítaním načítajú všetky súbory XML do vyrovnávacích pamätí v pamäti.

Poznámka: Zainteresovaní čitatelia si môžu referenčný program stiahnuť zo stránky Zdroje.

Analýza porovnania priepustnosti

Táto časť predstavuje výkon syntaktickej analýzy XML v latencii aj v priepustnosti. Všimnite si, že hoci sú VTD-XML a DOM priamo porovnateľné, nie je spravodlivé porovnávať VTD-XML s SAX alebo Pull, pretože v pamäti nevytvárajú žiadnu hierarchickú štruktúru. Takže výkon pre SAX a Pull slúži iba ako ďalší referenčný bod.

Priepustnosť

Porovnanie latencie

Tabuľka 1. Malé súbory

Názov / veľkosť súboruVTD-XML (ms)Opätovné použitie vyrovnávacej pamäte VTD-XML (ms)SAX (ms)DOM (ms)DOM odložený (ms)Pikola (ms)Pull (ms)
soap2.xml (1727 bajtov)0.04460.03460.07820.11220.162250.0920.066
nav_48_0.xml (4608 bajtov)0.10540.09280.2660.370.3850.27840.1742
cd_catalog.xml (5035 bajtov)0.1180.1080.190.3480.40.20.214
nav_63_0.xml (6848 bajtov)0.1490.1350.3540.5130.5570.4840.242
nav_78_0.xml (6920 bajtov)0.1530.1420.37040.5880.520.420.29

Tabuľka 2. Stredné súbory XML

$config[zx-auto] not found$config[zx-overlay] not found