2011-08-27 9 views
6

का उपयोग कर विशाल एक्सएमएल फ़ाइल पढ़ना इनपुट फ़ाइल में एक्सएमएल प्रारूप में हजारों लेनदेन शामिल हैं जो लगभग 10 जीबी आकार का है। उपयोगकर्ता इनपुट के आधार पर प्रत्येक लेनदेन एक्सएमएल चुनना और प्रसंस्करण प्रणाली को भेजना आवश्यक है।स्टैक्स और एक्सपीएथ

फ़ाइल

<transactions> 
    <txn id="1"> 
     <name> product 1</name> 
     <price>29.99</price> 
    </txn> 

    <txn id="2"> 
     <name> product 2</name> 
     <price>59.59</price> 
    </txn> 
</transactions> 

(तकनीकी) उपयोगकर्ता <txn> तरह इनपुट टैग नाम देने के लिए आशा की जाती है की नमूना सामग्री।

हम इस समाधान को अधिक सामान्य होने के लिए प्रदान करना चाहते हैं। फ़ाइल सामग्री अलग हो सकती है और उपयोगकर्ता अलग-अलग लेनदेन चुनने के लिए "//transactions/txn" जैसे XPath अभिव्यक्ति दे सकते हैं।

के बाद से फ़ाइल आकार बहुत बड़ा है, हम पूरी फ़ाइल लोड नहीं कर सकते कुछ तकनीकी बातें हम यहाँ पर विचार करने के

  • फ़ाइल एक साझा स्थान या FTP
  • में किया जा सकता है कर रहे हैं JVM

क्या हम इस परिदृश्य के लिए StAX पार्सर का उपयोग कर सकते हैं? इसे XPath अभिव्यक्ति को इनपुट के रूप में लेना है और लेनदेन एक्सएमएल चुनना/चुनना है।

सुझावों की तलाश में। अग्रिम में धन्यवाद।

+0

मेरे सिफारिश का जवाब मेम नक्शा मोड में बढ़ाया VTD-एक्सएमएल उपयोग करने के लिए है और 64 बिट जेवीएम –

उत्तर

8

स्टैक्स और एक्सपैथ बहुत अलग चीजें हैं। स्टैक्स आपको स्ट्रीमिंग एक्सएमएल दस्तावेज़ को केवल आगे की दिशा में पार्स करने की अनुमति देता है। एक्सपैथ दोनों दिशाओं में पार्सिंग की अनुमति देता है। स्टैक्स एक बहुत तेज स्ट्रीमिंग एक्सएमएल पार्सर है, लेकिन, यदि आप एक्सपैथ चाहते हैं, तो जावा के लिए एक अलग पुस्तकालय है।

एक बहुत ही इसी तरह की चर्चा के लिए इस सवाल का पर एक नज़र डालें: Is there any XPath processor for SAX model?

+2

यदि आप मुझे कम करने जा रहे हैं, तो कृपया एक टिप्पणी छोड़ दें। इस तरह हर कोई सीखता है! – Jon7

+0

वोटिंग नीचे क्योंकि आपका कथन "स्टैक्स और एक्सपैथ बहुत अलग चीजें हैं" सही नहीं है। XPath (कम से कम इसका सबसेट) अभी भी स्टैक्स मॉडल (पुल-मॉडल) में कार्यान्वित किया जा सकता है। इसे सी # https://msdn.microsoft.com/en-us/library/ms950778.aspx – TriCore

0

क्या आपको इसे तेजी से संसाधित करने की आवश्यकता है या आपको डेटा में तेज़ लुकअप की आवश्यकता है? इन आवश्यकताओं को विभिन्न दृष्टिकोण की आवश्यकता है।

पूरे डेटा के तेजी से पढ़ने के लिए StAX ठीक रहेगा।

यदि आपको कुछ डेटाबेस में लोड करने की आवश्यकता हो तो आपको तेज़ लुकअप की आवश्यकता है, बर्कले डीबी एक्सएमएल उदा।

1

यह निश्चित रूप से एक स्ट्रीमिंग और QuiXProc की तरह समानांतर प्रसंस्करण कार्यान्वयन के साथ XProc के लिए एक उपयोग मामला है (http://code.google.com/p/quixproc)

इस स्थिति में, आप

<p:for-each> 
    <p:iteration-source select="//transactions/txn"/> 
    <!-- you processing on a small file --> 
    </p:for-each> 

उपयोग करने के लिए तुम भी में से प्रत्येक wrapp कर सकते हैं होगा XProc

की एक पंक्ति के साथ परिवर्तन जिसके परिणामस्वरूप
<p:wrap-sequence wrapper="transactions"/> 

आशा इस मदद करता है

1

हम नियमित रूप से एक एसएक्स पार्सर का उपयोग करके 1 जीबी + जटिल एक्सएमएल फाइलों का विश्लेषण करते हैं जो वास्तव में आपके द्वारा वर्णित किया गया है: यह आंशिक डीओएम पेड़ निकालता है जिसे आसानी से XPATH का उपयोग करके पूछताछ की जा सकती है।

मैंने इसके बारे में here - यह एक SAX का उपयोग कर एक स्थिर पार्सर नहीं है, लेकिन यह देखने के लायक हो सकता है।

13

यदि प्रदर्शन एक महत्वपूर्ण कारक है, और/या दस्तावेज़ का आकार बड़ा है (दोनों जिनमें से मामला प्रतीत होता है), एक ईवेंट पार्सर (जैसे SAX या StAX) और मूल जावा XPath कार्यान्वयन के बीच का अंतर है कि बाद वाले वर्शन XPath अभिव्यक्ति का मूल्यांकन करने से पहले W3C DOM दस्तावेज़ बनाता है। [यह ध्यान रखना दिलचस्प है कि डीओएम या एक्सिओम जैसे सभी जावा दस्तावेज़ ऑब्जेक्ट मॉडल कार्यान्वयन इन-मेमोरी प्रस्तुति के निर्माण के लिए एक इवेंट प्रोसेसर (जैसे SAX या StAX) का उपयोग करते हैं, इसलिए यदि आप कभी भी ईवेंट प्रोसेसर के साथ ही प्राप्त कर सकते हैं दोनों स्मृति और एक डोम बनाने में लगने वाले समय को बचाते हैं।]

जैसा कि मैंने उल्लेख किया है, जेडीके में XPath कार्यान्वयन डब्ल्यू 3 सी डोम दस्तावेज़ पर काम करता है।

Document document = getParser().parse(source); 

एक्सएमएल के इस अपने 10GB के बाद प्रतिनिधित्व किया जाएगा: आप com.sun.org.apache.xpath.internal.jaxp.XPathImpl को देख जहां विधि का मूल्यांकन() पार्सर बुलाया जा रहा से पहले पहले स्रोत पार्स चाहिए द्वारा जावा JDK स्रोत कोड कार्यान्वयन में देख सकते हैं मेमोरी में (प्लस जो भी ओवरहेड) — शायद आप जो चाहते हैं उसे नहीं। जबकि आप अधिक "जेनेरिक" समाधान चाहते हैं, तो आपका उदाहरण XPath और आपका XML मार्कअप अपेक्षाकृत सरल प्रतीत होता है, इसलिए XPath के लिए वास्तव में एक मजबूत औचित्य प्रतीत नहीं होता है (शायद प्रोग्रामिंग लालित्य को छोड़कर)। XProc सुझाव के लिए यह भी सच होगा: इससे एक डोम भी बन जाएगा। यदि आपको वास्तव में एक डोम की आवश्यकता है तो आप डब्ल्यू 3 सी डोम की बजाय एक्सीम का उपयोग कर सकते हैं। एक्सिओम के पास एक बहुत दोस्ताना एपीआई है और यह अपने डोम को स्टैक्स पर बनाता है, इसलिए यह तेज़ है, और अपने एक्सपीएथ कार्यान्वयन के लिए जैक्सन का उपयोग करता है। जैक्सन को कुछ प्रकार की डोम (डब्ल्यू 3 सी डोम, डीओएम 4 जे, या जेडीओएम) की आवश्यकता है। यह सभी XPath कार्यान्वयनों के लिए सच होगा, इसलिए यदि आपको वास्तव में ईवेंट के साथ XPath चिपकने की ज़रूरत नहीं है तो पार्सर की सिफारिश की जाएगी।

एसएक्स पुराना स्ट्रीमिंग एपीआई है, जिसमें स्टैक्स नए और बहुत तेज़ सौदे हैं। या तो देशी JDK StAX कार्यान्वयन (javax.xml.stream) या Woodstox StAX कार्यान्वयन (जो काफी तेजी से होता है, मेरे अनुभव में) का उपयोग कर, मुझे लगता है कि पहली पर तत्व प्रकार नाम से मेल खाता एक एक्सएमएल घटना फिल्टर बनाने की सलाह देते हैं (अपने <txn> तत्वों पर कब्जा करने की)। यह घटनाओं (तत्व, विशेषता, पाठ) के छोटे विस्फोट बनाएगा जिन्हें आपके मिलान करने वाले उपयोगकर्ता मानों के लिए चेक किया जा सकता है। एक उपयुक्त मैच होने पर या तो आप घटनाओं या पाइप घिरे घटनाओं से आवश्यक जानकारी खींच उन लोगों से एक मिनी डोम के निर्माण के लिए कर सकता है यदि आप पाया परिणाम नेविगेट करने के लिए आसान था। लेकिन ऐसा लगता है कि मार्कअप सरल है तो यह अधिक हो सकता है।

यह संभवतः सबसे सरल, सबसे तेज़ संभव दृष्टिकोण होगा और एक डोम बनाने के मेमोरी ओवरहेड से बच जाएगा। आप फ़िल्टर को तत्व और विशेषता के नाम से पारित कर दिया है (ताकि आपके मिलान एल्गोरिथ्म विन्यास योग्य है) आप यह अपेक्षाकृत सामान्य बना सकता है।

+0

में कार्यान्वित किया गया है क्या आपने vtd-xml के बारे में सुना है? –

+0

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

+0

क्या आप कोड वितरित कर रहे हैं या इसे आंतरिक रूप से उपयोग कर रहे हैं? –

0

विशाल एक्सएमएल फाइलों को प्रोसेस करने के लिए एक मजेदार समाधान> 10 जीबी।

  1. रुचि के हिस्सों के लिए बाइट ऑफसेट बनाने के लिए एएनटीएलआर का उपयोग करें। यह एक डोम आधारित दृष्टिकोण की तुलना में कुछ स्मृति को बचाएगा।
  2. JAXB उपयोग बाइट की स्थिति से भागों को पढ़ने के लिए

विकिपीडिया के उदाहरण पर विवरण देखें उदासीनता इस में (17GB) अतः https://stackoverflow.com/a/43367629/1485527

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