के अंदर एक्सएमएल ट्विग को पुर्ज करें मैं XML::Twig के साथ बड़ी एक्सएमएल फाइलों (60 जीबी +) को पार्स कर रहा हूं और इसे ओओ (मूस) स्क्रिप्ट में उपयोग कर रहा हूं। जैसे ही वे स्मृति में पढ़े जाते हैं, तत्वों को पार्स करने के लिए मैं twig_handlers
विकल्प का उपयोग कर रहा हूं। हालांकि, मुझे यकीन नहीं है कि मैं एलिमेंट और ट्विग से कैसे निपट सकता हूं।उप हैंडलर
इससे पहले कि मैं मूस (और OO कुल मिलाकर) का इस्तेमाल किया, मेरी स्क्रिप्ट के रूप में निम्नानुसार देखा (और काम):
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
}
और अब मैं इसे इस तरह करना चाहते हैं।
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
}
बात मैं अब देखते हैं कि कि मैं fulltwig
का शुद्धिकरण याद आ रही है। मैंने सोचा कि - पहले, गैर-ओओ संस्करण - शुद्ध करने से स्मृति को बचाने में मदद मिलेगी: जितनी जल्दी हो सके पूर्णतया से छुटकारा पाएं। हालांकि, जब OO का उपयोग कर (और एक स्पष्ट sub{}
हैंडलर के अंदर पर भरोसा करने वाले) मैं नहीं दिख रहा है कि कैसे मैं पूरी टहनी सफाई कर सकते हैं क्योंकि प्रलेखन का कहना है कि
$ _ भी तत्व के लिए सेट है, तो यह की तरह
para => sub { $_->set_tag('p'); }
तो वे तत्व आप कार्रवाई करने के लिए चाहते हैं के बारे में बात इनलाइन संचालकों लिखने के आसान है, लेकिन fulltwig नहीं ही। तो अगर मैं subroutine को पारित नहीं किया जाता है तो मैं इसे कैसे हटा सकता हूं?
आह, मेरा बुरा! क्या चल रहा था यह देखने के लिए मुझे '@ _' का निरीक्षण करना चाहिए था। धन्यवाद! क्या आप केवल पूर्ण टहनियों को शुद्ध करने के लिए कोई नकारात्मक/उल्टा है * * के बाद * आपने कट टिग के साथ सामान किया है? मेरा तर्क * तत्व * को काटने के तुरंत बाद इसे शुद्ध करना था, ताकि स्मृति जितनी जल्दी हो सके साफ़ हो जाए। मैं गलत हो सकता हूं? रास्ते में महान मॉड्यूल, हम इसे ** सभी ** समय का उपयोग करें! –
जब आप शुद्ध करते हैं तो इसे कोई फर्क नहीं पड़ता है। सबसे महत्वपूर्ण बात यह है कि आप अगले उपट्री को पार्स करना शुरू करने से पहले स्मृति को पुनः प्राप्त करना सबसे महत्वपूर्ण है। और धन्यवाद; -) – mirod
यह करी मॉड्यूल के लिए भी एक अच्छा उपयोग मामला होगा। – simbabque