मैं एक्सडी दस्तावेज़ ऑब्जेक्ट्स में बड़े एक्सएमएल दस्तावेज़ लोड करना चाहता हूं। XDocument.Load(path, loadOptions)
का उपयोग कर सरल सिंक्रोनस दृष्टिकोण बहुत अच्छा काम करता है, लेकिन बड़ी फ़ाइलों (विशेष रूप से नेटवर्क स्टोरेज से) लोड करते समय एक जीयूआई संदर्भ में असहज रूप से लंबे समय तक ब्लॉक करता है।लोड एक्सडॉक्यूमेंट असीमित रूप से
मैंने दस्तावेज़ लोडिंग में प्रतिक्रिया को बेहतर बनाने के इरादे से इस एसिंक संस्करण को लिखा, विशेष रूप से नेटवर्क पर फ़ाइलों को लोड करते समय।
public static async Task<XDocument> LoadAsync(String path, LoadOptions loadOptions = LoadOptions.PreserveWhitespace)
{
String xml;
using (var stream = File.OpenText(path))
{
xml = await stream.ReadToEndAsync();
}
return XDocument.Parse(xml, loadOptions);
}
हालांकि, स्थानीय डिस्क से भरी हुई एक 200 एमबी एक्सएमएल कच्चे फ़ाइल पर, तुल्यकालिक संस्करण कुछ ही सेकंड में पूरा करता है। एसिंक्रोनस संस्करण (32-बिट संदर्भ में चल रहा है) के बजाय एक OutOfMemoryException
फेंकता है:
at System.Text.StringBuilder.ToString()
at System.IO.StreamReader.<ReadToEndAsyncInternal>d__62.MoveNext()
मैं कल्पना इस XDocument
द्वारा पार्स करने के लिए स्मृति में कच्चे एक्सएमएल पकड़ इस्तेमाल अस्थायी स्ट्रिंग चर के कारण है। संभवतः सिंक्रोनस परिदृश्य में, XDocument.Load()
स्रोत फ़ाइल के माध्यम से स्ट्रीम करने में सक्षम है, और पूरी फ़ाइल को पकड़ने के लिए कभी भी एक विशाल स्ट्रिंग बनाने की आवश्यकता नहीं है।
क्या दोनों दुनिया के सर्वश्रेष्ठ प्राप्त करने का कोई तरीका है? पूरी तरह से एसिंक्रोनस I/O के साथ XDocument
लोड करें, और बिना किसी अस्थायी स्ट्रिंग को बनाने की आवश्यकता के?
शायद आप का उपयोग करना चाहिए 'XDocument.Load (धारा)'? – DavidG
यह लोड ऑपरेशन को असीमित कैसे बनाएगा? – Hydrargyrum
ठीक है कि स्वयं में नहीं होगा, लेकिन यह आपके यहां मौजूद स्ट्रिंग वेरिएबल को समाप्त करेगा और उम्मीद है कि ओओएम अपवाद। – DavidG