2010-09-14 13 views
9

मैं संरचित मार्कअप डेटा की एक बड़ी फ़ाइल (> 2 जीबी) पार्स करने की कोशिश कर रहा हूं और इसके लिए स्मृति पर्याप्त नहीं है। इस स्थिति के लिए एक्सएमएल पार्सिंग क्लास का इष्टतम तरीका कौन सा है। अधिक जानकारी कृपया।क्या पाइथन xml ElementTree एक बहुत बड़ी एक्सएमएल फ़ाइल पार्स कर सकते हैं?

उत्तर

5

अधिकांश डोम पुस्तकालय - जैसे ElementTree - कोर में संपूर्ण दस्तावेज़ मॉडल बनाएं। परंपरागत रूप से, जब आपका मॉडल एक बार में स्मृति में फिट होने के लिए बहुत बड़ा होता है, तो आपको xml.sax जैसे अधिक स्ट्रीम-ओरिएंटेड पार्सर का उपयोग करने की आवश्यकता होती है।

यह अक्सर अपेक्षाकृत कठिन होता है कि यह होना चाहिए, विशेष रूप से जब पूरे डोम से निपटने जैसे उच्च-आदेश संचालन के लिए उपयोग किया जाता है।

क्या यह संभव है कि अपने xml दस्तावेज़ बल्कि सरल है की तरह

<entries> 
    <entry>...</entry> 
    <entry>...</entry> 
</entries> 

जो आप एक अधिक ElementTree मैत्रीपूर्ण ढंग से डेटा के सबसेट पर काम करने की अनुमति होगी?

+0

आपको बहुत बहुत धन्यवाद। – zhangwf

2

केवल API मैंने देखा है कि सभी पर बात की इस तरह संभाल कर सकते हैं pulldom है:

http://docs.python.org/library/xml.dom.pulldom.html

Pulldom SAX API का उपयोग करता आंशिक डोम नोड्स के निर्माण के लिए; एक समूह के रूप में विशिष्ट उप-पेड़ खींचकर और फिर जब आप पूरा कर लें तो उन्हें हटाकर, आप एसओएक्स की स्मृति दक्षता को डोम के उपयोग की स्वच्छता के साथ प्राप्त कर सकते हैं।

यह एक अधूरा एपीआई है; जब मैंने इसका इस्तेमाल किया तो मुझे इसे पूरी तरह प्रयोग करने योग्य बनाने के लिए इसे संशोधित करना पड़ा, लेकिन यह नींव के रूप में काम करता है। मैं अब इसका उपयोग नहीं करता, इसलिए मुझे याद नहीं आया कि मुझे क्या जोड़ना है; बस एक अग्रिम चेतावनी।

यह बहुत धीमा है।

एक्सएमएल बड़े डेटा सेट को संभालने के लिए एक बहुत ही खराब प्रारूप है। यदि आपके पास स्रोत डेटा पर कोई नियंत्रण है, और यदि यह डेटा सेट के लिए समझ में आता है, तो आप छोटे टुकड़ों में डेटा को तोड़ने से काफी बेहतर हैं कि आप पूरी तरह से स्मृति में पार्स कर सकते हैं।

दूसरा विकल्प SAX एपीआई का उपयोग कर रहा है, लेकिन वे सीधे कुछ भी करने के लिए गंभीर दर्द हैं।

11

iterparse() फ़ंक्शन देखें। बहुत बड़े दस्तावेजों को पार्स करने के लिए आप इसका उपयोग कैसे कर सकते हैं इसका विवरण here पाया जा सकता है।

+0

iterparse() फ़ंक्शन आपकी समस्या का समाधान करेगा, मैंने हाल ही में 1 जीबी एक्सएमएल दस्तावेज़ को आसानी से मदद की है :) –

संबंधित मुद्दे