2017-07-23 95 views
7

Büyük XML dosyalarını (60 GB +) XML::Twig ile ayrıştırıp bir OO (Moose) komut dosyasında kullanıyorum. Öğeleri belleğe okuduktan sonra öğeleri ayrıştırmak için twig_handlers seçeneğini kullanıyorum. Ancak, Element ve Twig ile nasıl başa çıkabileceğimi bilmiyorum. Ben (tamamen ve OO) Moose kullanılan ÖnceAlt işleyicideki XML XML iç geçirme

, benim senaryom şöyle baktım (ve amele):

my $twig = XML::Twig->new(
    twig_handlers => { 
    $outer_tag => \&_process_tree, 
    } 
); 
$twig->parsefile($input_file); 


sub _process_tree { 
    my ($fulltwig, $twig) = @_; 

    $twig->cut; 
    $fulltwig->purge; 
    # Do stuff with twig 
} 

Ve şimdi ben böyle yapardım.

my $twig = XML::Twig->new(
    twig_handlers => { 
    $self->outer_tag => sub { 
     $self->_process_tree($_); 
    } 
    } 
); 
$twig->parsefile($self->input_file); 

sub _process_tree { 
    my ($self, $twig) = @_; 

    $twig->cut; 
    # Do stuff with twig 
    # But now the 'full twig' is not purged 
} 

şey

Ben şimdi fulltwig temizlemesini Eksik görüyoruz olmasıdır. İlk olarak, OO olmayan versiyonda - temizleme işleminin hafızayı kurtarmaya yardımcı olacağını düşündüm: mümkün olan en kısa zamanda fulltwig'den kurtulmak. OO kullanarak (ve işleyicisi içinde açık bir sub{} güvenmek zorunda) Ancak, ben belgeleri

$ _, öğesinin ayarlanmış olduğunu söylüyor çünkü tam dal tasfiye nasıl görmüyorum, yüzden

para => sub { $_->set_tag('p'); }

yüzden işlemek istediğiniz Unsuru hakkında konuşmak gibi satır içi işleyicileri yazmak kolaydır, ancak fulltwig kendisi. Peki, alt programa aktarılmazsa nasıl silebilirim?

cevap

6

İşleyici, tam dalmayı hala alıyor, bunu kullanmıyorsunuz (bunun yerine $ _ yerine).

Sonradan anlaşıldı ki hala (docs Ben genellikle "eleman" dediğimiz veya elt) dal üzerinde purge çağırabilirsiniz: $_->purge çalışacak beklendiği gibi Doları cari elemana kadar tam dal tasfiye _ ;

Bir temizlikçi (IMHO) yolu aslında tüm parametreleri almak ve expicitely tam dal temizlemeye olacaktır:

my $twig = XML::Twig->new(
    twig_handlers => { 
    $self->outer_tag => sub { 
     $self->_process_tree(@_); # pass _all_ of the arguments 
    } 
    } 
); 
$twig->parsefile($self->input_file); 

sub _process_tree { 
    my ($self, $full_twig, $twig) = @_; # now you see them! 

    $twig->cut; 
    # Do stuff with twig 
    $full_twig->purge; # now you don't 
} 
+0

Aah, benim hatam! Neler olup bittiğini görmek için '@ 'kontrol etmeliydim. Teşekkürler! Tam dalmayı temizlemenin bir dezavantajı var mıdır? * Sonra * kesilmiş dalla bir şeyler yaptın mı? Benim düşüncem, * elementi * keserek hemen temizlemekti, böylece bellek mümkün olan en kısa sürede temizlendi. Yanlış olabilirim? Bu arada büyük modül, onu kullanıyoruz ** hepsi ** zaman! –

+1

Temizleme yaptığınızda farketmemelidir. En önemlisi, bir sonraki alt ağacı ayrıştırmaya başlamadan önce hafızayı geri almaktır. Ve teşekkürler; -) – mirod

+1

Bu da köri modülü için iyi bir kullanım durumu olurdu. – simbabque