2011-01-22 17 views
5

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

+0

इस प्रश्न पर पायथन टैग क्यों है? क्या आप उम्मीद कर रहे हैं कि लोग पाइथन समाधान प्रदान करेंगे? – Spaceghost

+0

क्या आप दस्तावेज़ को पार्स करते समय स्मृति त्रुटियों से बाहर निकलते हैं या जब आप xpath क्वेरीज़ आज़माते हैं? यदि दूसरा, शायद समस्या xpath प्रश्नों के साथ है। किसी भी तरह से, क्या आपने JVM के लिए ढेर के लिए -एक्सएमएक्स के मूल्य को बढ़ाने का प्रयास किया? – Spaceghost

+0

विस्तारित vtd-xml का प्रयास करें और मेमोरी मैपिंग विकल्प –

उत्तर

2

कोशिश http://code.google.com/p/jlibs/wiki/XMLDog

यह एक्सएमएल दस्तावेजों के इन-स्मृति प्रतिनिधित्व बनाने के बिना सैक्स का उपयोग कर xpaths निष्पादित करता है।

2

बहुत ही कुशल जब बड़ी फ़ाइलों

+1

का उपयोग करें आप सीधे सैक्स स्ट्रीम के साथ XPath का उपयोग नहीं कर सकते (प्रत्येक क्वेरी के लिए पूरी फ़ाइल को फिर से पार्स करने से कम)। –

+0

@Glenn Maynard - लेकिन निश्चित रूप से OP * को प्रत्येक क्वेरी (या प्रश्नों के बैच) के लिए फ़ाइल को दोबारा पोस्ट करना होगा। स्मृति में फिट करने के लिए डोम बहुत बड़ा है। –

2

क्या आप अभी क्या करने की कोशिश कर रहे हैं के साथ काम कर रहा है? इसकी आवाज़ से आप एक डोम आधारित पार्सर का उपयोग करने की कोशिश कर रहे हैं, जो अनिवार्य रूप से संपूर्ण XML फ़ाइल को स्मृति में डीओएम प्रतिनिधित्व के रूप में लोड करता है। यदि आप एक बड़ी फ़ाइल से निपट रहे हैं, तो आप एक SAX पार्सर का उपयोग करना बंद कर देंगे, जो स्ट्रीमिंग फैशन में XML दस्तावेज़ को संसाधित करता है।

मैं व्यक्तिगत रूप से इसके लिए StAX की अनुशंसा करता हूं।

0

क्या आपने मानक vtd या विस्तारित VTD-xml का उपयोग किया था? यदि आप विस्तारित एक्सएमएल का उपयोग करते हैं तो आपके पास मेमोरी मैपिंग का उपयोग करने का विकल्प है ... क्या आपने कोशिश की?

0

XPath का उपयोग करना एक बहुत अच्छा विचार नहीं हो सकता है यदि आप एक लंबे समय तक रहने वाले अनुप्रयोग में गतिशील रूप से कई अभिव्यक्तियों को संकलित करने की योजना बनाते हैं।

मुझे पूरी तरह से यकीन नहीं है कि XPath का जावा संस्करण कैसे काम करता है, लेकिन .NET XPath में एक गतिशील असेंबली संकलित करता है और फिर इसे ऐप डोमेन में जोड़ता है। अभिव्यक्ति के बाद के उपयोग अब विधानसभा में लोड असेंबली को देखते हैं।
एक मामले में, जहां मैं XPath का उपयोग कर रहा था, यह एक ऐसी स्थिति का कारण बनता है जहां मुझे लगता है, इस प्रकार की तंत्र स्मृति स्मृति रिसाव के समान स्मृति को भरने में धीमा हो रहा था।

मेरा सिद्धांत यह है कि प्रत्येक अभिव्यक्ति को उपयोगकर्ता के मानों का उपयोग करके संकलित किया गया था, इसलिए प्रत्येक संकलित अभिव्यक्ति अद्वितीय थी, इसलिए एक नई अभिव्यक्ति संकलित की गई और ऐप डोमेन में जोड़ा गया।
चूंकि आप संपूर्ण ऐप डोमेन को पुनरारंभ किए बिना ऐप डोमेन से असेंबली को हटा सकते हैं, प्रत्येक बार अभिव्यक्ति का मूल्यांकन किया जाने पर स्मृति का उपभोग किया जा रहा था और इसे पुनर्प्राप्त नहीं किया जा सका। नतीजतन, कोड मेमोरी में असेंबली के रूप में स्मृति को लीक कर रहा था, और थोड़ी देर के बाद, आप परिणामों को जानते हैं।

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