2011-10-12 8 views
6

मेरे पास निम्न समस्या है: मेरे पास बहुत बड़ी एक्सएमएल फाइलें हैं (जैसे 300+ मेग्स), और मुझे उनके कुछ मान डीबी में जोड़ने के लिए उन्हें पार्स करने की आवश्यकता है। इन फ़ाइलों की संरचना भी बहुत जटिल है। मैं स्टैक्स पार्सर का उपयोग करना चाहता हूं क्योंकि यह एक समय में एक्सएमएल फाइल के केवल हिस्सों को पुल-पार्सिंग (और इस प्रकार प्रोसेसिंग) की अच्छी संभावना प्रदान करता है, और इस प्रकार पूरी चीज को स्मृति में लोड नहीं कर रहा है, लेकिन दूसरी ओर मूल्यों को प्राप्त करना स्टैक्स (कम से कम इन एक्सएमएल फाइलों पर) बोझिल है, मुझे कोड का एक टन लिखना होगा। इस बाद के दृष्टिकोण से यह मेरी मदद करेगा अगर मैं एक्सएमएल फ़ाइल को जावा ऑब्जेक्ट्स (जैसे जेएक्स-बी करता है) में मार्शल कर सकता हूं, हालांकि यह पूरी फाइल को ऑब्जेक्ट इंस्टेंस के एक टन को एक बार में लोड करेगा।जावा ऑब्जेक्ट्स को बहुत बड़ी एक्सएमएल फाइलों और मार्शलिंग को पार्स करना

मेरा सवाल यह है कि फ़ाइल को अनुक्रमिक रूप से खींचने (या केवल आंशिक रूप से विश्लेषण) करने का कोई तरीका है, और उसके बाद केवल उन हिस्सों को जावा ऑब्जेक्ट्स में मार्शल करें ताकि मैं स्मृति पर बगैर आसानी से उनसे निपट सकूं?

उत्तर

2

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

मैं जितना समाधान मिला, उतना अधिक विस्तार से नहीं बताऊंगा, क्योंकि मैंने पहले ही कार्यान्वयन समाप्त कर लिया है, और यह यहां रखने के लिए कोड का एक बड़ा हिस्सा है (मैं इसके शीर्ष पर स्प्रिंग बैच का उपयोग करता हूं, एक टन के साथ विन्यास और सामान)।

बड़ा विचार यहाँ तथ्य यह है कि अगर आप एक XML दस्तावेज है और यह इसी XSD स्कीमा है, आप के साथ & मार्शल यह पार्स कर सकते है:

मैं हालांकि मैं क्या अंत में कर समाप्त हो गया पर एक छोटे से टिप्पणी कर देगा जेएक्सबी, और आप इसे टुकड़ों में कर सकते हैं, और कहा कि चंक्स को एसएक्सएक्स जैसे एक पार्सर के साथ पढ़ा जा सकता है और फिर जेएक्सबी मार्शलर को पास कर दिया जा सकता है।

इसका व्यावहारिक अर्थ यह है कि आपको पहले यह तय करना होगा कि आपकी एक्सएमएल फ़ाइल में एक अच्छी जगह कहां है, जहां आप कह सकते हैं "यहां इस हिस्से में दोहराव वाली संरचना है, मैं एक बार में उन दोहरावों का इलाज करूंगा"। उन दोहराव वाले हिस्सों आमतौर पर एक ही (बच्चे) टैग को मूल टैग के अंदर बहुत बार दोहराया जाता है। तो आपको बस इतना करना है कि अपने एसटीएक्स पार्सर में एक ईवेंट श्रोता बनाएं जो कि उन बच्चों के टैग की शुरुआत में ट्रिगर किया गया है, जेएक्सबी पर उस बच्चे टैग की सामग्री को स्ट्रीम करने के बजाय, इसे जेएक्सबी के साथ मार्शल करें और इसे संसाधित करें।

वास्तव में इस आलेख में विचार उत्कृष्ट रूप से वर्णित है, जिसका मैंने पालन किया (सच है, यह 2006 से है, लेकिन यह जेडीके 1.6 से संबंधित है जो उस समय बहुत नया था, इसलिए संस्करण के अनुसार यह बिल्कुल पुराना नहीं है):

http://www.javarants.com/2006/04/30/simple-and-efficient-xml-parsing-using-jaxb-2-0/

+0

आपकी जांच को जानना अच्छा है। बस सोच रहा है कि यह कैसे है (इस पोस्ट में सोलन) मैंने जो पोस्ट किया है उससे अलग है? – Kashyap

+0

खैर, ईमानदारी से यह बड़े ढांचे, भाग आलस्य का हिस्सा था :) (जिनमें से दोनों बुरे और खेदजनक हैं)। सबसे पहले, दस्तावेज ईएमएफ से एक सुंदर शामिल ढांचे की तरह लगता है, यह सिर्फ एक्सएमएल प्रसंस्करण के लिए नहीं बल्कि अन्य चीजों के टन के लिए है, और जब भी संभव हो तो मैं ऐसे भारी ढांचे से बचने की कोशिश करता हूं (यह सिर्फ व्यक्तिगत वरीयता है, मैं नहीं हूं यह सामान्य रूप से करना बुरा है)। दूसरा, मैं आलसी हूं, और ईएमएफ गैर-मानक एक्सएमएल पार्सिंग एपीआई का उपयोग करता है जो मुझे नहीं पता है क्योंकि मैंने मानक जावा एक्सएमएल एपीआई के साथ समाधान को प्राथमिकता दी है। –

+1

दरअसल, क्या आपको ईएमएफ पसंद आया या नहीं, मैंने इसका उपयोग नहीं करने की सिफारिश की ("** क्योंकि ईएमएफ इतनी छोटी समस्या के लिए हथौड़ा बहुत बड़ा है। **") जब तक कि आपके पास कोई विकल्प न हो। और पार्सर को दोबारा उद्धृत करने के लिए "तो ** जो कुछ भी आप चाहते हैं उसका उपयोग करके बस पार्स करें, कुछ स्ट्रिंगस्ट्रीम बनाएं या प्रत्येक के लिए लूप में कुछ बनाएं और ** जेएक्स-बी या ईएमएफ को पास करें। **" – Kashyap

5

मैं ग्रहण ईएमएफ की सिफारिश करता हूं। लेकिन यह वही समस्या है, अगर आप इसे फ़ाइल नाम देते हैं तो यह पूरी चीज का विश्लेषण करेगा। यद्यपि लोड करने के लिए कुछ विकल्प हैं, लेकिन मुझे बहुत परेशान नहीं किया गया क्योंकि हम 96 जीबी रैम वाली मशीनों पर चलते हैं। :)

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

बस थोड़ा विस्तृत करने के अपने XML इस तरह दिखता है:

<tag1> 
    <tag2> 
     <tag3/> 
     <tag4> 
      <tag5/> 
     </tag4> 
     <tag6/> 
     <tag7/> 
    </tag2> 

    <tag2> 
     <tag3/> 
     <tag4> 
      <tag5/> 
     </tag4> 
     <tag6/> 
     <tag7/> 
    </tag2> 
............ 
    <tag2> 
     <tag3/> 
     <tag4> 
      <tag5/> 
     </tag4> 
     <tag6/> 
     <tag7/> 
    </tag2> 
</tag1> 

तो यह एक एक्सएमएल में टूट किया जा सकता है प्रत्येक <tag2> के साथ शुरू और </tag2> के साथ समाप्त। और जावा में अधिकांश पार्सर्स स्ट्रीम स्वीकार करेंगे, इसलिए जो भी आप चाहते हैं उसका उपयोग करके पार्स करें, कुछ स्ट्रिंगस्ट्रीम बनाएं या प्रत्येक <tag2> के लिए लूप में कुछ करें और जेएक्स-बी या ईएमएफ पास करें।

एचटीएच

+0

यह कुछ ऐसा है महान लग रहा है और मैं (अब यहाँ यह आधी रात :)) पहली बात कल कोशिश करता हूँ कि। सुझाव के लिए धन्यवाद, –

+1

@thekashyap का वादा करता है। क्या मैं उन मशीनों में से एक कर सकता हूं, कृपया? बस एस! –

+0

हेहे .. वे हमारी टेस्ट मशीन हैं, घर पर मैं एक Win7 लैपटॉप पर काम करता हूं जिसमें 4 जीबी के साथ हर किसी की तरह .. :) – Kashyap

1

दस्तावेज़ प्रक्षेपण यहां जवाब हो सकता है। सैक्सन और कई अन्य XQuery प्रोसेसर इसे एक विकल्प के रूप में पेश करते हैं। यदि आपके पास एक उचित दस्तावेज है जो बड़े दस्तावेज़ से थोड़ी मात्रा में डेटा का चयन करता है, तो क्वेरी प्रोसेसर क्वेरी के विश्लेषण के लिए पेड़ के कौन से हिस्सों को उपलब्ध कराने के लिए क्वेरी का विश्लेषण करता है, और जिसे प्रसंस्करण के दौरान त्याग दिया जा सकता है। परिणामस्वरूप पेड़ अक्सर पूर्ण दस्तावेज़ के आकार का केवल 1% हो सकता है। सेक्सन यहाँ विवरण:

http://saxonica.com/documentation/sourcedocs/projection.xml

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