2013-02-17 46 views
8

से निपटना मेरे पास एक बहुत बड़ी एक्सएमएल फाइल है (20 जीबी सटीक है, और हाँ, मुझे यह सब चाहिए)।बड़ी एक्सएमएल फाइलें लोड करना और मेमोरी एरर

Python(23358) malloc: *** mmap(size=140736680968192) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
Traceback (most recent call last): 
    File "file.py", line 5, in <module> 
    code = xml.read() 
MemoryError 

यह वर्तमान कोड मेरे पास है, एक्सएमएल फ़ाइल को पढ़ने के लिए:: जब मैं फ़ाइल लोड करने का प्रयास है, मैं यह त्रुटि प्राप्त

from bs4 import BeautifulSoup 
xml = open('pages_full.xml', 'r') 
code = xml.read() 
xml.close() 
soup = BeautifulSoup(code) 

अब, मैं को नष्ट करने के बारे में कैसे जाना होगा यह त्रुटि और स्क्रिप्ट पर काम करना जारी रखने में सक्षम हो। मैं फ़ाइल को अलग-अलग फाइलों में विभाजित करने का प्रयास करूंगा, लेकिन जैसा कि मुझे नहीं पता कि यह सुंदर सूप के साथ-साथ एक्सएमएल डेटा को कैसे प्रभावित करेगा, मैं इसे नहीं करना चाहूंगा।

+2

क्या आपके पास 20 जीबी रैम है? यदि नहीं, भले ही आप इसे काम करने के लिए प्राप्त कर सकें, यह असहनीय रूप से धीमा होने वाला है क्योंकि यह अंदर और बाहर आ जाता है। हालांकि, एक समय में केवल lxml की तरह कुछ हिस्सों पर काम करने का एक तरीका हो सकता है। – Dougal

उत्तर

11

नहीं उपयोग BeautifulSoup क्या प्रयास करने के लिए (XML डेटा मैं पर स्वयंसेवक, इसे का उपयोग अलग-अलग समय-अवधियों के डेटा आयात करने के लिए, कई पृष्ठों से सीधे जानकारी का उपयोग कर एक विकी है एक डेटाबेस डंप है) और इस तरह के एक बड़े पार्स एक्सएमएल फ़ाइल। इसके बजाय ElementTree API का उपयोग करें। विशेष रूप से, iterparse() function का प्रयोग कर एक धारा के रूप में अपनी फ़ाइल को पार्स करने, जानकारी के प्रबंधन के रूप में आप तत्वों की सूचना दी जाती है, तो हटाना तत्वों फिर से:

from xml.etree import ElementTree as ET 

parser = ET.iterparse(filename) 

for event, element in parser: 
    # element is a whole element 
    if element.tag == 'yourelement' 
     # do something with this element 
     # then clean up 
     element.clear() 

एक घटना-आधारित दृष्टिकोण का उपयोग करके आप पकड़ की जरूरत कभी नहीं पूरे स्मृति में XML दस्तावेज़, आप केवल वही निकालें जो आपको चाहिए और बाकी को छोड़ दें।

iterparse() tutorial and documentation देखें।

वैकल्पिक रूप से, आप lxml library का भी उपयोग कर सकते हैं; यह एक ही एपीआई को एक तेज़ और अधिक फीचरफुल पैकेज में प्रदान करता है।