2012-09-13 10 views
5

क्या ParseResults को स्टोर न करने या मैन्युअल रूप से उन्हें त्यागने के लिए पाइपर्सिंग करना संभव है?पार्सिंग के दौरान पाइपर्सिंग पार्स रीसेट को कैसे हटाया जाए?

मैं वस्तुओं की एक बड़ी फाइल पार्स कर रहा हूं और प्रत्येक आइटम के लिए एक पार्स एक्शन के माध्यम से सभी पोस्ट-प्रोसेसिंग कर सकता हूं। तो जैसे ही एक आइटम को पार्स किया गया है, मुझे इसके लिए ParseResult की आवश्यकता नहीं है और मैं इसे छोड़ने में सक्षम होना चाहता हूं क्योंकि मैं जिस मशीन पर हूं, उसकी स्मृति सीमा को मार रहा हूं।

उत्तर

4

क्या आप टोकन को संसाधित करने के लिए पार्स क्रियाओं का उपयोग कर रहे हैं क्योंकि उन्हें पार्स किया गया है? यदि हां, तो आप डेल का उपयोग कर पार्स टोकन की सामग्री को नष्ट कर सकते हैं:

def parseActionThatDeletesTheParsedTokens(tokens): 
    # ... 
    # do something interesting with the tokens 
    # ... 

    # delete the contents of the parsed tokens 
    del tokens[:] 

या फिर आप scanString बजाय parseString उपयोग करने के लिए चाहते हो सकता है। इसके बजाय इस की:

OneOrMore(blockOfText).parseString(bigHonkingString) 

कार्य करें:

for tokens, matchstart, matchend in blockOfText.scanString(bigHonkingString): 
    # do stuff with the tokens 

scanString एक जनरेटर जो पैदावार का मिलान नहीं हुआ टोकन, प्रारंभिक युक्त 3-tuples, और प्रत्येक उत्तरोत्तर मैच की समाप्ति स्थान देता है। आप प्रत्येक पार्स किए गए सेट टोकन को संसाधित कर सकते हैं, फिर जब आप अगले सेट पर जाते हैं, तो पुराना सेट स्वचालित रूप से त्याग दिया जाता है। मुझे लगता है कि आपके कार्यक्रम में न्यूनतम परिवर्तन के साथ, यह आपके लिए सबसे आसान तरीका हो सकता है।

+0

हाँ, यही वह है जो मैं कर रहा हूं। इसे करने के लिए 'del' का उपयोग करना मुझे वास्तव में मेरे साथ होना चाहिए था लेकिन आप सही हैं, स्कैनस्ट्रिंग बहुत साफ है। पाइपर्सिंग को जानना बहुत अच्छा है। धन्यवाद! – nedned

+0

पॉल, 'parseAction' चलाए जाने के बाद भी वाक्यांश को' .suppress() 'स्मृति में रखता है? – Hooked

+0

नहीं - अगर एक अभिव्यक्ति दबा दी जाती है, तो इसकी सामग्री पाइपर्सिंग द्वारा सहेजी नहीं जाती है। – PaulMcG

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