Tak to ano :-)
Moje poznámka rozhodně nebyla generická, týkala se opravdu jen SAXu a
jeho implementace.

Genericky však platí, že pokud zpracovávám velké množství dat, vyplatí
se zamyslet zda potřebuji vyrábět nové objekty nebo zda to bude jen
benchmark garbage collectoru. Samozřejmě ne jako _premature_
optimalization.

Kamil Podlešák

2010/9/3 Oto Buchta <ta...@buchtovi.cz>:
> 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
>

Odpovedet emailem