2010-10-27 11 views
6

मैं नोकोगिरी का उपयोग कर रहा हूं जो छोटे दस्तावेजों के लिए अच्छी तरह से काम करता है। लेकिन 180 केबी एचटीएमएल फाइल के लिए मुझे ulimit -s के माध्यम से प्रक्रिया स्टैक आकार में वृद्धि करना है, और पार्सिंग और एक्सपीएथ प्रश्नों में काफी समय लगता है।रूबी के लिए तेज़ एक्सएमएल पार्सर्स क्या हैं?

क्या स्टॉक रूबी वितरण का उपयोग करके तेजी से उपलब्ध विधियां उपलब्ध हैं?

मैं XPath में उपयोग कर रहा हूं, लेकिन समाधान को XPath का समर्थन करने की आवश्यकता नहीं है।

मानदंड हैं:

  1. फास्ट लिखने के लिए।
  2. फास्ट निष्पादन।
  3. मजबूत परिणामस्वरूप पार्सर।
+0

nokogiri सबसे तेजी से मणि अभी – s84

+0

मैं बैल nokogiri –

उत्तर

6

नोकोगिरी libxml2 पर आधारित है, जो कि किसी भी भाषा में सबसे तेज़ एक्सएमएल/एचटीएमएल पार्सर्स में से एक है। यह सी में लिखा गया है, लेकिन कई भाषाओं में बाइंडिंग हैं।

समस्या यह है कि फ़ाइल जितना जटिल होगा, स्मृति में एक पूर्ण डोम संरचना बनाने में उतना ही समय लगेगा। एक डोम बनाना धीमा और अन्य पार्सिंग विधियों की तुलना में अधिक स्मृति-भूखा है (आमतौर पर पूरे डोम को स्मृति में फिट होना चाहिए)। XPath इस डोम पर निर्भर करता है।

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

एक मध्यम जमीन है: कुछ पार्सर्स में "पुल पार्सिंग" क्षमता होती है जहां आपके पास कर्सर जैसी नेविगेशन होती है। आप अभी भी अनुक्रमिक रूप से प्रत्येक नोड पर जाते हैं, लेकिन आप उस तत्व के अंत में "तेज़-आगे" जा सकते हैं जिसमें आप रुचि नहीं रखते हैं। इसे SAX की गति मिल गई है लेकिन कई उपयोगों के लिए एक बेहतर इंटरफ़ेस है। मुझे नहीं पता कि नोकोगिरी एचटीएमएल के लिए ऐसा कर सकता है, लेकिन यदि आप रुचि रखते हैं तो मैं Reader API देखता हूं।

ध्यान दें कि नोकोगिरी भी विकृत मार्कअप (जैसे वास्तविक दुनिया HTML) के साथ बहुत ही कमजोर है और यह अकेले इसे HTML पार्सिंग के लिए बहुत अच्छा विकल्प बनाता है।

+0

nokogiri की तुलना में बेहतर पाया है बहुत तेजी से अपेक्षा के अनुरूप नहीं है। अभी मुझे बड़ी एक्सएमएल फाइल पार्स करने में कोई समस्या है। मैं वास्तव में नहीं जानता कि फ़ाइल में कितने रिकॉर्ड हैं लेकिन फ़ाइल का आकार 7.2 एमबी है। इसलिए जब मैं पार्स करने की कोशिश करता हूं - नोकोगिरी लटकता है। और मेमोरी लीक – ajahongir

+0

तक पहुंचता है मुझे इस क्षमता में दिलचस्पी होगी। _ "फास्ट-फॉरवर्ड" जिस तत्व में आप रुचि नहीं रखते हैं, उसके अंत में Nokogiri SAX में यह है? –

+0

@ एरीआई के रूप में हैरीवुड सैक्स के रूप में आप सादा-वेनिला के रूप में प्राप्त कर सकते हैं। हालांकि, मणि [saxerator] (https://github.com/soulcutter/saxerator) देखें जो हुड के नीचे SAX का उपयोग करता है और अनिवार्य रूप से उस तत्व को तेज़ी से आगे बढ़ाएगा जिसे आप ढूंढ रहे हैं और वहां आइटमों का आकलन करें। –

0

आप पाएंगे कि बड़े एक्सएमएल दस्तावेज़ों के लिए डीओएम पार्सिंग बहुत प्रदर्शनकारी नहीं है। ऐसा इसलिए है क्योंकि पार्सर को XML दस्तावेज़ की संरचना का एक इन-मेमोरी मानचित्र बनाना है।

अन्य दृष्टिकोण जो आम तौर पर एक छोटी मेमोरी पदचिह्न की आवश्यकता होती है, एक ईवेंट संचालित सैक्स पार्सर का उपयोग करना है।

नोकोगिरी के पास सैक्स के लिए पूर्ण समर्थन है।

15

ऑक्स मणि देखें। यह LibXML और Nokogiri से तेज़ है और स्मृति पार्सिंग के साथ-साथ SAX कॉलबैक पार्सिंग में भी समर्थन करता है। पूर्ण प्रकटीकरण, मैंने इसे लिखा था।


प्रदर्शन की तुलना http://www.ohler.com/software/thoughts/Blog/Entries/2011/9/21_XML_with_Ruby.html में दोनों एक डोम (स्मृति में) और SAX (कॉलबैक) पारसर्स तुलना की जाती है।

+0

एचएम, क्या आप इसके लिए एक लिंक जोड़ना चाहते हैं? – maxschlepzig

+1

मैंने ऑक्स का उपयोग किया है, और मैं इसके साथ बहुत खुश हूं (https://github.com/ohler55/ox) –

+0

ऑक्स मणि में नोड्स, सीडीएटा जैसे उपयोग करने पर मुझे कुछ और दस्तावेज कहां मिल सकता है? –

2

ऑक्स से लिंक http://rubygems.org/gems/ox है।प्रदर्शन मतभेद की चर्चा: http://www.ohler.com/software/thoughts/Blog/Entries/2011/9/21_XML_with_Ruby.html

+0

मेरा सुझाव है कि आप अपने दो उपयोगकर्ता खातों को मर्ज करें (जिन्हें वही कहा जाता है?!?) और आपके दो उत्तरों। – maxschlepzig

0

अपने परिवेश के आधार पर, Oga बेहतर अनुकूल हो सकता है एक बेहतर इंटरफ़ेस है और तेजी से स्थापना समय के साथ रूबी के लिए एक काफी तेजी से एक्सएमएल पारसर्स के रूप में।

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