Dne 3. září 2010 11:04 Kamil Podlesak <kamil.podle...@gmail.com> napsal(a): > S čím konkrétně nesouhlasíte? Nějak mi to nedává smysl...
S generickým tvrzením, že při zpracování obrovských XML je třeba hlídat OutOfMemory. Mnoho lidí o pull parserech v životě neslyšelo a proto by ono tvrzení mělo obsahovat klíčovou formulaci "při použití SAXu", už jenom proto, aby to lidi trklo, že asi existuje technologie zpracování XML jiná než SAX, u které to nehrozí. Ano, mohl jsem volit slova jako "ještě bych doplnil...", ale takto je to více do očí bijící. Takže nic proti. > Samozřejmě, pull parser je v takovémto případě lepší než SAX - však > také proto pull parsery vůbec existují. > Ale to neznamená, že se nikdo nepokoušel SAX parser optimalizovat. > > Kamil Podlešák > > 2010/9/2 Oto Buchta <ta...@buchtovi.cz>: >> Dne 1. září 2010 15:48 Kamil Podlesak <kamil.podle...@gmail.com> napsal(a): >>> Ono se to nezdá, ale používání stále jediné datové struktury (místo >>> vytváření nových) ušetří hodně práce garbage collectoru a u opravdu >>> obrovských xml to bude znát (dokonce by mohlo dojít OutOfMemoryError). >> >> Nesouhlasím. U opravdu velkých XML (řádově stovky MB a více) není >> konstrukce objektové reprezentace XML vůbec žádoucí a tedy pro tento >> případ je HashMapa na atributy získávaná pomocí PullParseru ideálním >> řešením. A dobrý Pull Parser používá pool, takže se akorát přesunou >> Stringy. Doufám, že takto funguje STAX (JSR 173). Nikdy jsem jiný než >> Systinetí PullParser nepoužíval - od dob Systinetu jsem nedělal s >> velkými XML. >> >>> Kamil Podlešák >>> >>> 2010/9/1 Tomáš Procházka <t.procha...@centrum.cz>: >>>> Díky za tip. Zajímavé, že to v 99% funguje takto naprosto v pořádku, >>>> kopírovat všechny atributy do hashmapy pro každý XML element mi příjde jako >>>> zbytečnost, když už to je vše v instanci Attributes :-( >>>> >>>> >>>> --------------------------- Původní zpráva --------------------------- >>>> Odesilatel: Kamil Podlesak <kamil.podle...@gmail.com> >>>> Předmět: Divná chyba v SAX parseru? >>>> Datum: 1. září 2010, 11:25:40 (GMT +0200) >>>> Přílohy: <none> >>>> msgid:aanlktim1orq7=mcrkbitxqjgseuxprdncpsbrsc4s...@mail.gmail.com >>>> >>>> K> Zdravím, >>>> >>>> K> Nejedná se o chybu, v dokumentaci (javadoc k metodě startElement, od >>>> K> verze 1.5 výše) je napsáno: >>>> >>>> K> atts - the attributes attached to the element. If there are no >>>> K> attributes, it shall be an empty Attributes object. The value of this >>>> K> object after startElement returns is undefined >>>> >>>> K> Ta poslední věta je klíčová: data z těch atributů si musíte "vytahat" >>>> K> do nějaké vlastní struktury. >>>> >>>> K> Kamil Podlešák >>>> >>>> K> 2010/9/1 Tomáš Procházka <t.procha...@centrum.cz>: >>>>>> Zdravím. >>>> >>>>>> Setkal se už někdo s tím, že si standardní SAX parser v JDK 1.6 >>>>>> (konkrétně >>>>>> mám 1.6.0.18) vymýšlí neexistující hodnota atributů v XML? >>>> >>>>>> Konkrétně mám XML, které obsahuje kromě jiného asi 20 000 takovýchto >>>>>> elementů? >>>>>> <replace key="...">...</replace> například <replace >>>>>> key="unsubscribe">http://nekde.cz/neco.html</replace> >>>> >>>>>> V SAX handleru, bez jakéhokoliv knihovny, jen v samotné Javě. >>>> >>>>>> V handleru pak v metod >>>> >>>>>> public void startElement() si pak pouze uložím do třídních proměnných >>>>>> atributy tagu a nuluju StringBuffer >>>> >>>>>> this.value.setLength(0); >>>>>> this.attributes = attributes; >>>> >>>>>> v endElement() pak ukládám do mapy vždy hodnotu atributu key a obsah >>>>>> celého >>>>>> elementu, tedy: >>>> >>>>>> someMap.put(attributes.getValue("key"), value.toString()); >>>> >>>>>> všechno funguje, až na to, že zhruba v 300 případech z těch 20 000 >>>>>> elementů >>>>>> se přečte úplně jiný klíč, přípustné hodnoty jsou jen unsubscribe a link >>>>>> a v >>>>>> těch 300 případech tam je něco jako " <" >>>> >>>>>> Což je samozřejmě nepřípustné >>>> >>>> >>>>>> Zkoušel jsem za >>>> >>>>>> this.attributes = attributes; >>>> >>>>>> přidat >>>> >>>>>> if (attributes.getValue(0) != null && >>>>>> !"link".equals(attributes.getValue(0)) >>>>>> && !"unsubscribe".equals(attributes.getValue(0))) { >>>>>> logger.error("-------- '" + attributes.getValue(0) + "'"); >>>>>> } >>>> >>>>>> abych si zalogoval všechny případy kdy k tomu dojde a přestalo to dělat, >>>>>> téměř úplně >>>> >>>>>> Takové chování VM vůbec nechápu. Kdyby to dělalo jen na jednom stroji, >>>>>> tak >>>>>> řeknu, že je něco rozbité na něm. Jenže na ten problém jsme přišli na >>>>>> Linuxovém serveru a bez problémů jsem ho napodobil i na Windows stroji. >>>>>> navíc import ještě probíhá jen v jednom vlákně. >>>> >>>> >>>> >>>>>> Datum: 9:38:09 1. září 2010 >>>>>> -- >>>>>> --------------------------------------------------------------------- >>>>>> Tomáš Procházka >>>> >>>> >>>>>> E-mail: t.procha...@centrum.cz >>>>>> WWW: http://www.atomsoft.cz >>>>>> ICQ: 87147320 >>>>>> --------------------------------------------------------------------- >>>> >>>> >>>> ------------------------ Konec původní zprávy ------------------------ >>>> >>>> -- >>>> --------------------------------------------------------------------- >>>> Tomáš Procházka >>>> >>>> >>>> E-mail: t.procha...@centrum.cz >>>> WWW: http://www.atomsoft.cz >>>> ICQ: 87147320 >>>> --------------------------------------------------------------------- >>> >> >> >> >> -- >> Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com >> > -- Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com