2011-09-13 7 views
5

मैं एक बहुत बड़ी एक्सएमएल फ़ाइल (700 एमबी +) बना रहा हूं जो बैच के माध्यम से बड़ी मात्रा में डेटा संसाधित करता है। कार्यक्रम एक बेहद बड़े sybase डेटाबेस और एक आवेदन के बीच एक इंटरफेस के रूप में कार्य करता है। मैं वर्तमान में कक्षाओं के लिए बाध्य xsd स्कीमा है। मुझे तर्क को फिर से शुरू करने के साथ एक्सएमएल लिखने में सक्षम होने का एक तरीका चाहिए।जावा जेएक्सबी - तर्क को पुनरारंभ करने के साथ एक्सएमएल फाइलों को लिखना

आईई। यह जानने में सक्षम है कि मैंने कहां छोड़ा था। या दूसरे शब्दों में, यदि प्रोग्राम विफल रहता है, तो मुझे यह देखने में सक्षम होना चाहिए कि आखिरी बार एक्सएमएल फाइल को क्या लिखा गया था, इसलिए यह कहां उठाया जा सकता है। यहाँ एक exmaple है।

<root> 
    <WorkSet> 
    <Work> 
     <Customer> 
    <Work> 
     <Customer> 
    <WorkSet> 
    <Work> 
     ..... 
<root> 

कहें कि प्रोग्राम 'काम' या 'वर्कसेट' नोड लिखने के बाद विफल रहता है। क्या प्रसंस्करण छोड़ने के लिए कोई रास्ता है? मैं एक्सएमएल फ़ाइल के कतरनी आकार के कारण एक्सएमएल फ़ाइल को स्मृति में वापस पढ़ने से बचने की कोशिश कर रहा हूं (कहें कि यह एक्सएमएल के 500 एमबी खत्म करता है और विफल रहता है)।

सहायता के लिए धन्यवाद।

उत्तर

3

यदि आप अपने डेटा को स्वतंत्र वर्कसेट तत्वों में विभाजित कर सकते हैं तो आप उन्हें एक बार JAXB के खंड मोड (जब जेएक्सबी हेडर नहीं लिखते) के साथ एक बार लिख सकते हैं। बाद में बस फाइलों को संयोजित करें और लापता एक्सएमएल घोषणा जोड़ें, अंत समापन टैग खोलना।

यह संभव है कि आपको इसके लिए अपने जेनरेट किए गए वर्गों को संशोधित करना होगा। मेरा मतलब वर्कसेट जावा क्लास में @XmlRootElement जोड़ना है। यदि एक कार्य के लिए एक वर्कसेट अभी भी बड़ा है तो आप इसे कार्य के साथ भी कर सकते हैं, लेकिन आपको किसी भी तरह के लापता टैग उत्पन्न करना होगा।

+0

+1 - मैं इन पंक्तियों के साथ कुछ सुझाव देने जा रहा था। –

+0

वर्कसेट जावा क्लास में @XmlRootElement टैग जोड़ना एकाधिक वर्कसेट्स के समापन के बाद एक बड़ी एक्सएमएल फ़ाइल की कार्यक्षमता को प्रभावित करेगा? मैं कुछ नया जेएक्सबी हूं इसलिए मुझे बताएं कि क्या मैं इसे सही ढंग से समझ नहीं रहा हूं। – TyC

+1

मुझे नहीं लगता कि एक '@ XmlRootElement' जोड़ना आपकी पूर्व कार्यक्षमता को प्रभावित करेगा। '@ xmlRootElement' को जोड़ने के बिना 'मार्शलर.मारशाल()' निम्नलिखित अपवाद फेंकता है: 'com.sun.istack.SAXException2: मार्शल प्रकार में असमर्थ" org.package.MyWorkSet "तत्व के रूप में क्योंकि यह एक गायब है @ XmlRootElement एनोटेशन'। – palacsint

2

मुझे नहीं लगता कि JAXB इस काम के लिए उचित उपकरण है, लेकिन ...

आप एक कस्टम Marshaller कार्यान्वयन कि क्या वस्तुओं मार्शल कर दिया है का ट्रैक रखता है लिख सकते हैं और लिखने के लिए टुकड़ा मोड इस्तेमाल कर सकते हैं व्यक्तिगत वस्तुओं।

+0

+1 जेएक्सबी सही उपकरण की तरह नहीं लगता है। एक सैक्स पार्सर का उपयोग क्यों न करें और आप ट्रैक कर सकते हैं कि आप फ़ाइल में कहां हैं। उदाहरण के लिए StAX पर एक नज़र डालें ... http://stax.codehaus.org/Home – Brad

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