2010-09-29 179 views
10

कुछ हद तक संबंधित: libxml2 from javaडोक्स पार्सिंग से सैक्स पार्सिंग तेज क्यों है? और कैसे काम करता है?

हाँ, यह प्रश्न अपेक्षाकृत लंबी हवा वाली है - क्षमा करें। मैंने जितना संभव महसूस किया उतना घना रखा है। मैंने पूरी बात पढ़ने से पहले इसे देखना आसान बनाने के लिए प्रश्नों को बोल्ड किया।

सैक्स तेजी से डोम पार्स से क्यों पार्स करने की जाती है? एकमात्र चीज जिसके साथ मैं आ सकता हूं वह यह है कि w/sax आप शायद आने वाले डेटा के बहुमत को अनदेखा कर रहे हैं, और इस प्रकार एक्सएमएल के समय प्रसंस्करण भागों को बर्बाद नहीं कर रहे हैं जिनकी आपको परवाह नहीं है। IOW - w/SAX पार्स करने के बाद, आप मूल इनपुट को पुन: बना नहीं सकते हैं। यदि आपने अपना SAX पार्सर लिखा है, तो यह प्रत्येक xml नोड (और इस प्रकार मूल को फिर से बना सकता है) के लिए जिम्मेदार है, तो यह डोम की तुलना में तेज़ नहीं होगा?

कारण मैं पूछ रहा हूँ कि मैं और अधिक तेजी से XML दस्तावेज़ों पार्स करने के लिए कोशिश कर रहा हूँ है। मुझे पार्सिंग के बाद पूरे एक्सएमएल पेड़ तक पहुंच की आवश्यकता है। मैं तीसरे पक्ष की सेवाओं के लिए प्लग-इन लिखने के लिए एक मंच लिख रहा हूं, इसलिए मैं अनुमान नहीं लगा सकता कि एक्सएमएल दस्तावेज़ के कौन से हिस्सों की आवश्यकता होगी और कौन से हिस्से नहीं होंगे। मुझे आने वाले दस्तावेज़ की संरचना भी नहीं पता है। यही कारण है कि मैं जैक्सबी या सैक्स का उपयोग नहीं कर सकता। मेमोरी पदचिह्न मेरे लिए कोई मुद्दा नहीं है क्योंकि एक्सएमएल दस्तावेज छोटे हैं और मुझे एक समय में स्मृति में केवल 1 की आवश्यकता है। यह वह समय है जो मुझे अपेक्षाकृत छोटे एक्सएमएल दस्तावेज़ को पार्स करने के लिए लेता है जो मुझे मार रहा है। मैंने पहले स्टैक्स का उपयोग नहीं किया है, लेकिन शायद मुझे आगे की जांच करने की ज़रूरत है क्योंकि यह मध्य मैदान हो सकता है? यदि मैं सही ढंग से समझता हूं, तो स्थिर मूल XML संरचना को रखता है और उन हिस्सों को संसाधित करता है जिन्हें मैं मांग पर मांगता हूं? इस तरह, मूल पार्स समय जल्दी हो सकता है, लेकिन हर बार जब मैं इसे पेड़ के हिस्से को पार करने के लिए कहता हूं तो यह अभी तक नहीं चला है, जब प्रसंस्करण होता है?

आप एक लिंक है कि सवालों के अधिकांश का जवाब देता प्रदान करते हैं, मैं अपने जवाब को स्वीकार करेंगे (आप सीधे मेरे सवालों का जवाब अगर वे पहले से ही कहीं जवाब कर रहे हैं की जरूरत नहीं है)।

अद्यतन: मैं सैक्स में यह दुबारा लिखा और यह औसत 2.1 एमएस पर दस्तावेज़ों पार्स करता है। यह एक सुधार (16% तेजी से) 2.5 एमएस कि डोम ले रहा था खत्म हो गया है लेकिन यह परिमाण है कि मैं (एट अल) अनुमान लगाया गया है जाएगा

धन्यवाद

+0

मैं कहूंगा कि जिस प्रश्न का तेज़ तेज़ है, वह आपके उद्देश्यों के लिए अप्रासंगिक है, क्योंकि आपको पेड़ के खिलाफ मनमाने ढंग से पूछताछ करने की आवश्यकता है। जिसका अर्थ है कि आपको पेड़ के कुछ प्रतिनिधित्व का निर्माण करना है, और इसके खिलाफ प्रश्न बनाने का कोई तरीका है। तो या तो आप डोम/XPath का उपयोग करते हैं, या आप अपने समकक्ष लिखते हैं। – Anon

+0

मुझे संदेह है कि, आपका असली मुद्दा सैक्स बनाम डीओएम प्रति नहीं है, लेकिन आपका सिस्टम कैसे कॉन्फ़िगर किया गया है और/या आप डेटा तक कैसे पहुंच रहे हैं। इसे वास्तव में डोम (या डोम समकक्षों में से एक) का उपयोग करके "छोटे" दस्तावेज़ को पार्स करने में इतना लंबा समय नहीं लेना चाहिए। क्या आपने SAX और DOM के बीच अंतर (जिसे आप देख रहे हैं) को प्रमाणित किया है? – Anon

+0

मैंने डीओएम दृष्टिकोण को प्रमाणित किया है। छोटे (लगभग 300k) xml दस्तावेज़। वर्तमान कार्यान्वयन xerces-j का उपयोग कर रहा है और 1.5 गीगाहर्ट्ज़ मशीन पर प्रति xml दस्तावेज़ में लगभग 2.5 एमएस लगता है। sax को मापने के लिए कुछ हद तक निर्भर है कि आप कितने एक्सएमएल को चुनने के लिए चुनते हैं और आप इसके साथ क्या करते हैं। आप सही हैं - मुझे नहीं लगता कि सैक्स मेरे लिए काम करेगा - प्रश्न जिज्ञासा से अधिक था। – andersonbd1

उत्तर

14

मान लिया जाये कि आप कुछ नहीं करते लेकिन दस्तावेज़ को पार्स, अलग पार्सर मानकों की रैंकिंग इस प्रकार है:

1. StAX सबसे तेजी से

  • घटना आप को सूचित किया जाता है

2. SAX बगल में है

  • यह करता है सब कुछ StAX करता है और सामग्री (तत्व नाम, नामस्पेस, गुण, ...)

3. डोम पिछले

  • यह सब कुछ SAX करता है स्वचालित रूप से महसूस किया है और सूचना को नोड के उदाहरण के रूप में प्रस्तुत करता है।

आपका केस उपयोग

  • आप XML के सभी बनाए रखने के लिए की जरूरत है, डोम मानक प्रतिनिधित्व है। यह एक्सएसएलटी (javax.xml.transform), XPath (javax.xml.xpath), और स्कीमा सत्यापन (javax.xml.validation) एपीआई के साथ साफ रूप से एकीकृत करता है। हालांकि यदि प्रदर्शन महत्वपूर्ण है, तो आप एक डोम पार्सर की तुलना में तेजी से StAX का उपयोग करके अपनी खुद की वृक्ष संरचना का निर्माण करने में सक्षम हो सकते हैं।
+0

उम, आपको क्या लगता है जब "ईवेंट आपको सूचित किया जाता है" बनाम "सामग्री स्वचालित रूप से महसूस हो जाती है"? – Anon

+4

StAX रिपोर्ट करेगा कि तत्व प्रारंभ हो गया है, यदि आप कभी भी तत्व नाम या यूआरआई के लिए नहीं पूछते हैं तो उस डेटा को स्ट्रिंग ऑब्जेक्ट्स के रूप में कभी भी महसूस नहीं किया जाना चाहिए। दूसरी तरफ एक सैक्स पार्सर को एहसास होगा कि घटना के हिस्से के रूप में स्ट्रिंग ऑब्जेक्ट्स के रूप में डेटा। –

+0

शायद। और यदि आप मुझे बताते हैं कि आपने स्टैक्स के आंतरिक भाग को देखा है और यह एक चरित्र-आधारित राज्य मशीन के चारों ओर बनाया गया है, तो मैं आपको विश्वास करूंगा। हालांकि, मैं उम्मीद करता हूं कि यह आंतरिक रूप से टोकन उत्पन्न करे, भले ही आप कभी उनसे न पूछें। – Anon

10

डोम पार्स लोड करने के लिए आवश्यक है कि आप नहीं है पूरे दस्तावेज़ को स्मृति में और फिर इच्छित जानकारी ढूंढने के लिए एक पेड़ को पार करें।

SAX उतना ही स्मृति की आवश्यकता के रूप में आप बुनियादी आईओ सब करने की ज़रूरत है, और आप जानकारी है कि आप की जरूरत के रूप में दस्तावेज़ पढ़ा जा रहा है निकाल सकते हैं। चूंकि SAX स्ट्रीम उन्मुख है, इसलिए आप एक फ़ाइल को भी संसाधित कर सकते हैं जो अभी भी किसी अन्य प्रक्रिया द्वारा लिखी जा रही है।

+0

हाँ, मैं समझता हूं। मेरा सवाल था "सैक्स तेजी से क्यों चल रहा है?" नहीं "सैक्स और डोम के बीच क्या अंतर है?" – andersonbd1

+0

@ Stargazer712 - मिकरोबी के जवाब ने मेरे प्रश्न का समाधान नहीं किया। मुझे संदेह है कि उसने सवाल भी पढ़ा है। यह किसी भी डोम/सैक्स प्रश्न का एक उत्तर जवाब है। अगर कोई व्यक्ति विचारशील उत्तर देने के लिए समय लगाएगा तो मेरे पास खुले दिमाग है। – andersonbd1

+2

@ andersonbd1, मैंने आपका प्रश्न तैयार किया, मुझे खेद है कि आप मेरा जवाब नहीं समझ पाए। मेरे लिए यह बहुत स्पष्ट है कि एक प्रक्रिया जिसके लिए अधिक मेमोरी की आवश्यकता होती है, और जब तक यह पूरी तरह से पार्स नहीं किया जाता है तब तक आपको डेटा तक पहुंच नहीं दी जाएगी, एक प्रक्रिया से धीमी हो जाएगी जिसके लिए बहुत कम मेमोरी की आवश्यकता होती है और आपको डेटा को जितनी जल्दी हो सके पढ़ा जा सकता है। – mikerobi

10

SAX तेज है क्योंकि डोम पार्सर्स अक्सर एक दस्तावेज़ को आंतरिक रूप से पार्स करने के लिए एक SAX पार्सर का उपयोग करते हैं, फिर प्रत्येक नोड का प्रतिनिधित्व करने के लिए ऑब्जेक्ट बनाने और छेड़छाड़ करने का अतिरिक्त कार्य करें, भले ही एप्लिकेशन उनकी परवाह न करे।

एसएक्स का उपयोग करने वाला एक एप्लीकेशन सीधे डीओएम "पार्सर" की तुलना में अधिक जानकारीपूर्वक सेट सेट का उपयोग करने की संभावना है।

StAX एक खुश मध्यम जहां एक आवेदन SAX की घटना चालित दृष्टिकोण की तुलना में एक अधिक सुविधाजनक एपीआई हो जाता है, अभी तक पूरी तरह से डोम बनाने की अक्षमता ग्रस्त नहीं है।

1

SAX डीओएम से अधिक तेज़ है (आमतौर पर बड़े एक्सएमएल दस्तावेज को पढ़ने पर महसूस किया जाता है) क्योंकि सैक्स आपको घटनाओं के क्रम के रूप में जानकारी देता है (आमतौर पर एक हैंडलर के माध्यम से पहुंचाया जाता है) जबकि डोम नोड बनाता है और नोड निर्माण संरचना का प्रबंधन करता है जब तक कि डोम पेड़ न हो पूरी तरह से बनाया गया (जैसा कि XML दस्तावेज़ में दर्शाया गया है)।

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

मैं वास्तव में StAX पर टिप्पणी नहीं कर सकता क्योंकि मैंने कभी इसके साथ नहीं खेला है।

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