2009-01-02 14 views
17

मुझे कुछ जटिल एक्सपैथ प्रश्नों सहित सी # में काफी बड़ी एक्सएमएल फाइलों (यहां बड़े पैमाने पर एक गीगाबाइट के ऊपर होने पर) पर कुछ प्रसंस्करण करने की आवश्यकता है। मेरी समस्या यह है कि मैं सामान्य रूप से सिस्टम.एक्सएमएल पुस्तकालयों के माध्यम से इसे सामान्य तरीके से करता हूं, इससे पहले कि यह कुछ भी करता है, इससे पहले कि यह फ़ाइल कुछ भी करता है, जिससे स्मृति को इस आकार की फाइलों के साथ समस्या हो सकती है।.NET में बहुत बड़ी XML फ़ाइलों के साथ XPath का सर्वोत्तम उपयोग कैसे करें?

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

एक तरह से मैं यह काम करने की देख सकते हैं, सरल विश्लेषण एक धारा-आधारित दृष्टिकोण का उपयोग कर और शायद XSLT परिवर्तनों है कि मैं फ़ाइलों में बाद में चला सकते में XPath बयान लपेटकर प्रदर्शन करने के लिए है।

वैकल्पिक रूप से मुझे पता है कि कुछ तत्व हैं जो XPath क्वेरी नहीं चलेंगे, इसलिए मुझे लगता है कि मैं दस्तावेज़ को मूल पेड़ संरचना के आधार पर छोटे टुकड़ों की एक श्रृंखला में तोड़ सकता हूं, जो शायद काफी छोटा हो सकता है बहुत अधिक विनाश के बिना स्मृति में प्रक्रिया।

मैं यहां अपने उद्देश्य की व्याख्या करने, इसलिए यदि मैं सामान्य दृष्टिकोण के मामले में पूरी तरह से गलत पेड़ भौंकने कर रहा हूँ की कोशिश की है मुझे यकीन है कि आप लोगों को मुझे सही सेट कर सकते हैं हूँ ...

उत्तर

0

आप प्रयास कर रहे हैं XPathDocument? इस वर्ग को XPath क्वेरी को कुशलता से संभालने के लिए अनुकूलित किया गया है।

आप अपने इनपुट दस्तावेजों कुशलतापूर्वक XPathDocument का उपयोग कर आप पूर्व प्रसंस्करण और/या विभाजित एक XmlReader का उपयोग कर अपने इनपुट दस्तावेजों पर विचार हो सकता नहीं संभाल सकता है।

1

आपने पहले से ही अपने विकल्पों को रेखांकित किया है।

या तो आप XPath और उपयोग XmlTextReader का परित्याग करने की जरूरत है या आप प्रबंधनीय हिस्सा है जिस पर आप XPath का उपयोग कर सकते में दस्तावेज़ को तोड़ने की जरूरत है।

यदि आप बाद उपयोग का निर्णय लेते हैं XPathDocument इसके केवल पढ़ने के लिए प्रतिबंध स्मृति का बेहतर इस्तेमाल किया है।

1

आदेश मानक नेट कक्षाएं पूरे दस्तावेज़ पेड़ की जरूरत के साथ XPath क्वेरी करने में स्मृति जो एक अच्छा विचार नहीं हो सकता है अगर यह एक गीगाबाइट तक लग सकते हैं में लोड करने के लिए। IMHO XmlReader ऐसे कार्यों को संभालने के लिए एक अच्छी कक्षा है।

+0

XPathDocument एक हल्के वजन वर्ग भी है। –

+2

XPathDocument के साथ समस्या यह है कि पूरा दस्तावेज़ स्मृति में लोड किया जाएगा। –

1

ऐसा लगता है कि आपने पहले से ही XPathDocument का उपयोग करने का प्रयास किया है और पार्स किए गए XML दस्तावेज़ को स्मृति में समायोजित नहीं कर सका।

यदि यह मामला है, तो फ़ाइल को विभाजित करने से पहले (जो अंततः सही निर्णय है!) आप Saxon XSLT/XQuery प्रोसेसर का उपयोग करने का प्रयास कर सकते हैं। इसमें एक लोड किए गए XML दस्तावेज़ ("tinytree" model) का एक बहुत ही कुशल इन-मेमोरी प्रतिनिधित्व है। इसके अलावा Saxon SA (शेमा-जागरूक संस्करण, जो मुफ़्त नहीं है) में some streaming extensions है। इस here के बारे में और पढ़ें।

1

कैसे सिर्फ एक डेटाबेस में पूरी बात को पढ़ने और फिर अस्थायी डेटाबेस के साथ काम के बारे में? यह बेहतर हो सकता है क्योंकि तब आपके प्रश्नों को टीएसक्यूएल का उपयोग करके अधिक कुशलता से किया जा सकता है।

+0

डेटा क्लास के साथ एक सामान्य सूची बनाने का एक और विकल्प हो सकता है। इसे XML डेटा के साथ भरें और linq का उपयोग करके क्वेरी से पूछें। मैं हाल ही में ऐसा कर रहा हूं और यह वास्तव में अच्छा काम करता है। –

2

गीगाबाइट एक्सएमएल फाइलें! मैं आपको यह काम ईर्ष्या नहीं देता हूं।

क्या कोई तरीका है कि फ़ाइलों को बेहतर तरीके से भेजा जा सकता है? जैसे क्या उन्हें नेट पर भेजा जा रहा है - यदि वे सभी संबंधित लोगों के लिए एक अधिक कुशल प्रारूप बेहतर हो सकते हैं। फ़ाइल को डेटाबेस में पढ़ना एक बुरा विचार नहीं है लेकिन यह वास्तव में बहुत समय ले सकता है।

मैं पूरी फ़ाइल को पढ़कर स्मृति में यह सब कोशिश नहीं करता - जब तक आपके पास 64 बिट ओएस और बहुत सारी मेमोरी न हो। अगर फ़ाइल 2, 3, 4 जीबी हो जाती है तो क्या होगा?

एक्सएमएल फ़ाइल में एक और दृष्टिकोण पढ़ा जा सकता है और फाइल को पार्स करने के लिए SAX का उपयोग कर सकता है और कुछ लॉजिकल स्प्लिट के अनुसार छोटी एक्सएमएल फाइलें लिख सकता है। इसके बाद आप इन को XPath के साथ संसाधित कर सकते हैं। मैंने 20-30 एमबी फाइलों पर XPath का उपयोग किया है और यह बहुत तेज़ है। मैं मूल रूप से SAX का उपयोग करने जा रहा था लेकिन सोचा था कि मैं XPath को एक दूंगा और आश्चर्यचकित था कि यह कितनी जल्दी था। मैंने बहुत सारे विकास का समय बचाया और शायद प्रति प्रश्न 250ms खो गया। मैं अपने पार्सिंग के लिए जावा का उपयोग कर रहा था लेकिन मुझे संदेह है कि .NET में थोड़ा अंतर होगा।

मैंने पढ़ा है कि एक्सएमएल :: ट्विग (ए पर्ल सीपीएएन मॉड्यूल) एसएक्स आधारित एक्सपीएथ पार्सिंग को संभालने के लिए स्पष्ट रूप से लिखा गया था। क्या आप एक अलग भाषा का उपयोग कर सकते हैं?

यह भी मदद कर सकता है https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1044772.html

1

मुझे लगता है कि सबसे अच्छा समाधान अपने स्वयं के XML पार्सर कि छोटे-छोटे टुकड़ों पूरी फ़ाइल पढ़ सकते हैं नहीं बनाने के लिए है, या आप छोटे फ़ाइलों में बड़ी फाइल विभाजित है और साथ डॉटनैट कक्षाओं का उपयोग कर सकते इन फाइलें समस्या यह है कि आप पूरा डेटा उपलब्ध होने तक कुछ डेटा पार्स नहीं कर सकते हैं, इसलिए मैं अपने स्वयं के पार्सर का उपयोग करने की सलाह नहीं देता, डॉटनेट कक्षा

9

XPathReader उत्तर है। यह सी # रनटाइम का हिस्सा नहीं है, लेकिन यह माइक्रोसॉफ्ट से डाउनलोड के लिए उपलब्ध है। यहां एक MSDN article है।

यदि आप XmlTextReader के साथ XPathReader बनाते हैं तो आपको XPath अभिव्यक्तियों की सुविधा के साथ स्ट्रीमिंग की दक्षता मिलती है।

मैंने इसे गीगाबाइट आकार की फ़ाइलों पर उपयोग नहीं किया है, लेकिन मैंने इसे उन फ़ाइलों पर उपयोग किया है जो मेगाबाइट्स के दसियों हैं, जो आमतौर पर डोम आधारित समाधानों को धीमा करने के लिए पर्याप्त होता है।

नीचे से उद्धरण: "XPathReader एक्सएमएल दस्तावेजों को स्ट्रीमिंग तरीके से एक्सपीएथ करने की क्षमता प्रदान करता है"।

Download from Microsoft

+1

XPathReader की स्थिति/संस्करण अनिश्चित है। स्पष्ट रूप से 2004 से अद्यतन नहीं किया गया है। Http://stackoverflow.com/questions/465237/what-ever-happened-to-xpathreader – mjv

+0

देखें, मैं इसे 5 जीबी फाइलों के साथ उपयोग कर रहा हूं और यह बहुत अच्छी तरह से काम करता है। – bloparod

0

अपने मामले में डेटा आकार जीबीएस में चला सकते हैं जब से तुम एक डाटाबेस के रूप में XML के साथ ADO.NET का उपयोग कर माना जाता है। इसके अलावा स्मृति पदचिह्न भी बड़ा नहीं होगा।

एक और दृष्टिकोण XElementStream जैसे तत्वों का उपयोग करने के साथ लिंक से एक्सएमएल का उपयोग करेगा। उम्मीद है की यह मदद करेगा।

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