2014-06-30 6 views
6

0x0xपर एक xml फ़ाइल में लाइन संख्या कैसे प्राप्त करें मैं लगभग 300 जीबी की एक XML फ़ाइल में linenumber प्राप्त करने में असमर्थ हूं। IXmlLineInfo.LineNumber एक int32 है और जब यह int.MaxValue से अधिक है तो ऋणात्मक संख्या लौटा दी जाती है। अगर मैं एक int या linenumber स्टोर करने के लिए लंबे समय तक उपयोग करने के लिए लंबे समय तक उपयोग करते हैं तो इससे कोई फर्क नहीं पड़ता। Xmlreader eof पढ़ने के लिए सक्षम है। .NET 2.0 और नवीनतम संस्करण का उपयोग करना भी int32 का उपयोग करता है।int.Maxvalue

public void ReadLines() 
    { 
     long readcounter = 0; 
     long linenumber = 0; 
     fname = "I:\\XML Files\\europe-latest.osm"; 
     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.ProhibitDtd = false; 
     settings.XmlResolver = null; 
     XmlReader reader = XmlReader.Create(fname, settings); 

     IXmlLineInfo lineInfo = ((IXmlLineInfo)reader); 
     try 
     { 
      while (reader.Read()) 
      { 
       linenumber = lineInfo.LineNumber; 
       readcounter++; 
       if (readcounter % 1000000 == 0) Console.WriteLine(linenumber.ToString()); 
      } 
     } 
     catch (XmlException ex) 
     { 
      Console.WriteLine(ex.Message); 
      Console.ReadLine(); 
     } 
     finally 
     { 
      reader.Close(); 
      Console.WriteLine(DateTime.Now.ToLongTimeString()); 
     } 

    } 
+10

भगवान की मां, एक 300 जीबी एक्सएमएल फ़ाइल? क्या आपको यकीन है? – tnw

+7

शायद आपको लाइन नंबर प्राप्त करने के बारे में चिंता करना बंद कर देना चाहिए, और एक्सएमएल फ़ाइल को इतनी बड़ी अनुमति देने की अनुमति देने पर ध्यान देना चाहिए। – mason

+0

@ केविनकूक हेस कह रहा है lineInfo.LineNumber एक int32 है। – Jono

उत्तर

1

और भी बहुत कुछ नहीं है तुम कोशिश कर सकते हैं:

1) System.Numerics.BigInteger का उपयोग वास्तविक लाइन नंबर स्टोर करने के लिए - प्रत्येक ऑपरेशन है कि लाइन नंबर कम नहीं की तुलना में यह पहले था है के बाद की जाँच करें, वास्तविक स्टोर करते हुए BigInteger में लाइन नंबर। ठीक है, एक बहुत ही भारी फ़ाइल में यह वास्तव में अतिप्रवाह कर सकते हैं और अधिक से अधिक की तुलना में यह पहले था बन (, पढ़ने के बाद, उदाहरण के लिए कुछ भीतरी वेतन वृद्धि में 5 अरब लाइन तत्व):

var actualLine = new System.Numerics.BigInteger(0); 

Int32 lastInt32Line = lineInfo.LineNumber; 

// Some Xml reading 

Int32 diff = lineInfo.LineNumber - lastLine; 

// If an overflow has happened - add overflow 
if (diff >= 0) 
    actualLine += (new BigInteger(Int32.MaxValue)) * 2 - diff; 
else // Everything is normal - add the diff 
    actualLine += diff; 

असली संभावित समस्या यह है कि बावजूद तथ्य यह है कि आप लाइन नंबर को सही ढंग से XmlReader के आंतरिक को संकुचित करना शुरू कर सकते हैं। मेरी राय में checked पूर्णांक अंकगणितीय कोड डिफ़ॉल्ट होना चाहिए, जैसा कि अब अनचेक नहीं है - जब ओवरफ़्लो होता है तो वर्ग दूषित हो जाता है अगर इसे स्पष्ट रूप से अन्यथा नहीं बताया जाता है।

2) डेटा को अधिक खंडित तरीके से डेटा को संभालने के लिए अपने डेटा संग्रहण को पुनर्गठित करें।
3) अपने स्वयं के XmlReader लिखें जो BigInteger का उपयोग करता है।

+0

मैं इस उत्तर को स्वीकार करता हूं, मुख्य रूप से क्योंकि मैं सहमत हूं कि मैं कोशिश नहीं कर सकता हूं। – user204427

1

यह dotpeek साथ एक सा की जांच करने के बाद, ऐसा लगता है समस्या गहरा आंतरिक XmlTextReaderImpl वर्ग में निहित है (यह पाठक प्रयोग कर रहे हैं के वास्तविक प्रकार होना चाहिए) और आंतरिक प्रकार यह उपयोग कर रहा है:

internal struct LineInfo 
{ 
    internal int lineNo; 
    internal int linePos; 
    // ... 
} 

यदि आप न्यूनतम काम के साथ इस तक संपर्क करना चाहते हैं, तो मैं आपको .NET source code प्राप्त करने की सलाह देता हूं, XmlTextReaderImpl (और सभी संबंधित आंतरिक प्रकार) की प्रतिलिपि बनाकर अपना स्वयं का एक्सएमएल रीडर बनाएं, सभी लाइन नंबर int एस BigInteger एस के साथ प्रतिस्थापित करें। यदि आप प्रकार को छिपाना चाहते हैं, तो आप एक इंटरफेस IXmlBigLineInfo या इसी तरह के बनाना चाहते हैं, और IXmlLineInfo के बजाय इसका उपयोग करें।

उम्मीद है कि इससे मदद मिलती है।

+0

मैं .NET 2.0 में हूं। 2.0 में XmlTextReader पूरी तरह से एक्सएमएल अनुरूप नहीं था इसलिए मैं इसका उपयोग नहीं कर सकता। उदाहरण के लिए, यदि कोई अपरिचित नामित इकाई पढ़ी जाती है तो यह लाइन समाप्ति को सामान्य नहीं करता है या अपवाद फेंकता है। शायद यह 4 द्वारा तय किया गया था।5 लेकिन मुझे शक है क्योंकि XmlReader क्लास एक एमएस अनुशंसा करता है। हो सकता है कि यह XmlTextReaderImpl पर लागू न हो और आसानी से इसका परीक्षण कर सके। – user204427

+0

XmlTextReaderImpl * है * जब आप 'XmlReader.Create' कहते हैं तो आपको क्या मिलता है। 'Reader.GetType()' जांचें। – gwiazdorrr

+0

सुनिश्चित नहीं है कि उस वर्ग का उपयोग करना अच्छा दीर्घकालिक है। इसे एमएसडीएन एक्सएमएल फोरम के रूप में मिला: TextReaderImpl एक आंतरिक वर्ग है जो XmlReader "इंटरफ़ेस" लागू करता है। जब आप XmlReader को कॉल करते हैं तो पाठक सेटिंग्स के आधार पर आपको इस कक्षा का एक उदाहरण मिल सकता है। बनाएं। कक्षा सार्वजनिक नहीं है क्योंकि इसकी सभी कार्यक्षमता XmlReader क्लास के माध्यम से सामने आती है जिसे वह प्राप्त करता है। आपको XmlReader के actuall कार्यान्वयन वर्ग के आधार पर कोई निर्णय नहीं लेना चाहिए क्योंकि हम भविष्य में इसे बदलना चुन सकते हैं। धन्यवाद, विटेक करस [एमएसएफटी] – user204427

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