🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
7 messages
7 total messages Started by Jacek Kalinski Mon, 22 Nov 2010 13:26
alternatywa dla XML::Parser ?
#52049
Author: Jacek Kalinski
Date: Mon, 22 Nov 2010 13:26
16 lines
1327 bytes
Od razu zaznaczam, że perla znam w szczątkowej formie (preferuję inne 
języki programowania). Mam plik XML o wielkości 400MB ($file).
To już pewnie rozumiecie dlaczego perl ;)

Dlaczego:
my $parser = XML::Parser->new( ErrorContext => 2, Style => "Tree" );
$parser->parsefile( $file );

wykonanie tylko tych 2 wierszy trwa ponad 3 minuty?
Komputer ma procesor 1.8GHz (Athlon 3000+).
Czy da się to jakoś przyspieszyć, zakładając, że później muszę przejść
po całej strukturze?

PS: odczyt plku to 6.7 sekundy, dlatego dysk nie jest najsłabszym ogniwem.

Jacek
Re: alternatywa dla XML::Parser ?
#52050
Author: Michal Jankowski
Date: Mon, 22 Nov 2010 13:57
4 lines
904 bytes
Zależy, co potem z tym robisz... Sprawdź np. XML::LibXML z użyciem
XML::LibXML::SAX 

  MJ
Re: alternatywa dla XML::Parser ?
#52054
Author: MaW
Date: Mon, 22 Nov 2010 17:23
24 lines
1869 bytes
Użytkownik "Jacek Kalinski" <jacek_kal@go2._NOSPAMPLEASE_.pl> napisał w 
wiadomości news:slrniekrrg.llq.jacek_kal@nntp.dyski.one.pl...
> Od razu zaznaczam, że perla znam w szczątkowej formie (preferuję inne
> języki programowania). Mam plik XML o wielkości 400MB ($file).
> To już pewnie rozumiecie dlaczego perl ;)
>
> Dlaczego:
> my $parser = XML::Parser->new( ErrorContext => 2, Style => "Tree" );
> $parser->parsefile( $file );
>
> wykonanie tylko tych 2 wierszy trwa ponad 3 minuty?

Dlatego, że nie czytasz pliku, tylko go parsujesz tzn rozpoznajesz elementy 
w pliku i budujesz w pamięci odpowiednią strukturę.    Byc może wiedząc coś 
więcej o pliku XML dałoby się cos wymyślić.

Może wystarczy XML::Simple z parserem SAX? - nie testowałem, ale warto 
spróbować:
http://search.cpan.org/~grantm/XML-Simple-2.18/lib/XML/Simple.pm#SAX_SUPPORT
dodatkowo jeśli odwołujesz się wielokrotnie do tego pliku możesz włączyć 
cache=>storable

MaW 
Re: alternatywa dla XML::Parser ?
#52051
Author: Jacek Kalinski
Date: Mon, 22 Nov 2010 18:16
43 lines
2347 bytes
W artykule <kjzy68lcvg4.fsf@ccfs1.fuw.edu.pl>, Michal Jankowski napisał(a):

> Zależy, co potem z tym robisz... Sprawdź np. XML::LibXML z użyciem
> XML::LibXML::SAX 

Już mi się nie podoba.
XML::Parser potrzebował na "wczytanie" pliku niecałych 3 minut i użył
przy tym 1505MB pamięci, a:
XML::LibXML potrzebował na wczytanie pliku ponad 4 minuty i użył ponad 
1800MB pamięci, a na dodatek load komputera skoczył podczas wczytywania
do 13 (fakt - zaczął korzystać ze swapa, ale bez przesady).

Czyli rozwiązanie jeszcze gorsze, albo ja go nie umiem wykorzystać.
Sprawdzone przy pomocy:

my $parser = XML::LibXML->new();
my $doc    = $parser->parse_file($file);

A wracając do drugiego pytania co ja z tym potrzebuję zrobić:
mam plik, w którym mam strukturę na wzór:
<root>
  <elem id="1" attr1="..." attr2="..." attr3="...">
    <elem2>...</elem2>
    <elem3>...</elem3>
    <elemn>...</elemn>
  </elem>
  <elem id="xxx" attr1="..." attr2="..." attr3="...">
    <elem2>...</elem2>
    <elem3>
      <elem5>...</elem5>
      <elem5>...</elem5>
    </elem3>
    <elemn>...</elemn>
  </elem>
</root>
Struktura nie jest uporządkowana.
Teraz potrzebuję znaleźć wszystkie rekordy, które zawierają attr2 i attr3 
o konkretnej (stałej) wartości.
Mając taki rekord, potrzebuję odczytać wszystkie elementy (wg konkretnej 
nazwy) oraz przetworzyć wszystkie elementy "elem5" (które mogą być 
w dowolnej liczbie, tj. 0, 1, lub więcej).

Jacek
Re: alternatywa dla XML::Parser ?
#52055
Author: Jacek Kalinski
Date: Mon, 22 Nov 2010 18:22
24 lines
1746 bytes
W artykule <ice8v0$oed$1@news.onet.pl>, MaW napisał(a):

>> Dlaczego:
>> my $parser = XML::Parser->new( ErrorContext => 2, Style => "Tree" );
>> $parser->parsefile( $file );
>>
>> wykonanie tylko tych 2 wierszy trwa ponad 3 minuty?
>
> Dlatego, że nie czytasz pliku, tylko go parsujesz tzn rozpoznajesz elementy 
> w pliku i budujesz w pamięci odpowiednią strukturę.    Byc może wiedząc coś 
> więcej o pliku XML dałoby się cos wymyślić.

Szczerze? Bo taki przykład w sieci znalazłem :(
Strukturę pliku podałem pod postem Michała. Podałem również co potrzebuję
z tego pliku odczytać i wg jakich kryteriów.

> Może wystarczy XML::Simple z parserem SAX? - nie testowałem, ale warto 
> spróbować:

Tak przygotowane dane przetwarzam dalej XML::SimpleObject.
Ale dalsze przetwarzanie trwa dosłownie chwilę w porównaniu do parsowania.
Chyba, że można jakoś pominąć parsowanie pliku?

Jacek
Re: alternatywa dla XML::Parser ?
#52052
Author: hubert depesz lubaczewski
Date: Mon, 22 Nov 2010 18:55
19 lines
1608 bytes
On 2010-11-22, Jacek Kalinski <jacek_kal@go2._NOSPAMPLEASE_.pl> wrote:
> W artykule <kjzy68lcvg4.fsf@ccfs1.fuw.edu.pl>, Michal Jankowski napisał(a):
>
>> Zależy, co potem z tym robisz... Sprawdź np. XML::LibXML z użyciem
>> XML::LibXML::SAX 
>
> Już mi się nie podoba.
> XML::Parser potrzebował na "wczytanie" pliku niecałych 3 minut i użył
> przy tym 1505MB pamięci, a:

użyj xml::parsera, ale z uzyciem przetwarzania zdarzeniowego  (Handlers
=> { Start => ..., End => ..., Char => })
bardzo to lubię, bo nie zużywa prawie w ogóle pamięci.

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: alternatywa dla XML::Parser ?
#52053
Author: Michal Jankowski
Date: Mon, 22 Nov 2010 20:27
19 lines
1810 bytes
Jacek Kalinski <jacek_kal@go2._NOSPAMPLEASE_.pl> writes:

> W artykule <kjzy68lcvg4.fsf@ccfs1.fuw.edu.pl>, Michal Jankowski napisał(a):
>
>> Zależy, co potem z tym robisz... Sprawdź np. XML::LibXML z użyciem
>> XML::LibXML::SAX 
> Już mi się nie podoba.
> XML::Parser potrzebował na "wczytanie" pliku niecałych 3 minut i użył
> przy tym 1505MB pamięci, a:
> XML::LibXML potrzebował na wczytanie pliku ponad 4 minuty i użył ponad 
> 1800MB pamięci, a na dodatek load komputera skoczył podczas wczytywania
> do 13 (fakt - zaczął korzystać ze swapa, ale bez przesady).

Ale nie użyłeś SAX (przetwarzania strumieniowego, czy jak mu tam),
tylko zwyczajnie przeparsowałeś całość do drzewka w pamięci, prawda?
Bo ja jednak o SAX myślałem - tylko że wtedy program pisze się
inaczej... I nie obiecuję, że to pomoże 8-)

  MJ
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads