2010-10-06 11 views
6

मैं कुछ धीमी गति से चलने वाले कोड को दोबारा करने की कोशिश कर रहा हूं जो कई डेटाटेबल्स के नेस्टेड लूप का उपयोग करके एक्सएमएल लिखता है। मैंने पढ़ा है कि xml लिखने के लिए linq का उपयोग तेजी से होगा। मैं linq में अच्छी तरह से परिचित नहीं हूँ, तो मैं यहाँ कुछ मदद पाने की उम्मीद कर रहा था।वेब सेवा से डेटाटेबल्स को XML में लिखने का सबसे अच्छा तरीका XML में?

कुछ चीजों को मुझे जिक्र करने की आवश्यकता है कि वर्तमान आर्किटेक्चर एक webservice का उपयोग करता है जो डेटाटेबल्स में हमें डेटा देता है। फिर हम डेटाटेबल्स (इसके माध्यम से) के माध्यम से जाते हैं, और कई ऐसे हैं जो कई नेस्टेड लूप का परिणाम देते हैं।

उदाहरण:

dt1 = Webservice.getStuff(); 

for each (datarow r1 in dt1.Rows) { 

    dt2 = Webservice.getMoreStuff(r1[col1], r1[col2]); 
    // write out some xml 

    for each (datarow r2 in dt2.Rows) { 

     dt3 = Webservice.getEvenMoreStuff(r2[col1], r2[col2]); 
     // write out more xml 

     for each (datarow r3 in dt3.Rows) { 
      // write out more xml 
     } 

    } 
} 

आप देख सकते हैं स्पष्ट कारणों के लिए, यह बहुत धीमी है। क्या linq का उपयोग करके इसे गति देने का कोई तरीका है? आप इस बात को दोबारा करने के लिए एक और अधिक कुशल दृष्टिकोण के रूप में क्या सुझाव देंगे? मुझे खेद है कि विवरण अस्पष्ट हैं ...

मैं किसी भी मदद की पेशकश की सराहना करता हूं।

+5

यहां धीमा हिस्सा वेब सेवा के लिए कॉल प्रतीत होता है, न कि XML लेखन भाग। वेब सेवा में धीमी, उच्च विलंबता वाली अंगूठी है =) – Jens

+0

सिर्फ एक विचार: वर्तमान कोड स्निपेट दिया गया है कि XML कैसे बनाया गया है इसका कोई विवरण नहीं है, साथ ही नेटवर्क पर बड़ी मात्रा में डेटा भेजा जा सकता है, बहुत से सर्वर कॉल और क्लाइंट डेटा टेबल की साइड आबादी - सभी प्रदर्शन हिट का कारण बन सकता है; इसलिए यह मानने का कोई स्पष्ट कारण नहीं है कि एक्सएमएल लेखन एक बाधा है। –

+0

क्या आप एक और getStuff विधि को फिर से लिख सकते हैं या जोड़ सकते हैं जो आपको webservice कॉल घोंसले के बजाय पूर्ण परिणाम देता है? – jmservera

उत्तर

14

एक्सएमएल लिखना इस मामले में आपको धीमा कर रहा है। यह गति सभी वेब सेवा कॉल करने में व्यतीत समय की तुलना में नगण्य होना चाहिए।

एक्सएमएल के लेखन पर ध्यान केंद्रित करने के बजाय, मैं यह समझने की कोशिश करता हूं कि वेब सेवा कॉल की संख्या को कैसे संपीड़ित किया जाए ताकि आप अपने सभी डेटा को नेस्टेड कॉल करने के बजाए एक बार में प्राप्त कर सकें।

+3

किसी भी प्रकार के बड़े पाश में वेब सेवा कॉल मुझे डरता है – Spooks

+0

हां, मैं मानता हूं कि एक गंभीर समस्या webservice कॉल है, लेकिन समस्या यह है कि मेरे पास webservice पर कोई नियंत्रण नहीं है और मुझे प्रत्येक पूर्ववर्ती कॉल से जानकारी प्राप्त करने की आवश्यकता है बाद की webservice विधियों को कॉल करने के लिए। –

+2

@ जॉनी: लेकिन फिर 'सबसे तेज़ लिखने' के लिए पूछना इतना उपयोगी नहीं है। –

1

यदि आप Linq2Xml का उपयोग करना चाहते हैं तो आपको Linq2Datasets की भी आवश्यकता होगी।

इस तरह आप लूप के लिए अपने नेस्टेड को एक लिंक क्वेरी में बदल सकते हैं और एक्सएमएल में चयन कर सकते हैं।

मुझे उम्मीद है कि XmlWriter का उपयोग करना तेज हो सकता है, और निश्चित रूप से कम स्मृति का उपयोग करेगा। लेकिन यह लिखने के लिए थोड़ा और काम होगा।

+0

उसे लिंक 2 डेटासेट की आवश्यकता क्यों होगी? इसके अलावा आप लिंक से एक्सएमएल और एक्सएमएलवाइटर के बीच गति अंतर का आधार क्या करते हैं। – Adkins

+0

1) आप इसके बिना DataRows क्वेरी नहीं कर सकते हैं। और 2) XmlWriter सीधे लिखता है, Linq2Xml पहले एक दस्तावेज़ बनाता है। फिर XmlWriter का उपयोग करता है –

4

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

3

ऐसा लगता है कि आपको अपने ऐप को पहले और सबसे महत्वपूर्ण प्रोफाइल करने की आवश्यकता है - शायद ANTS का निःशुल्क परीक्षण या आपके लिए भी काम करेगा।

1

डेटासेट के लिए एक्सएमएल और LINQ करने के लिए LINQ का उपयोग करके आप इस तरह अपने खुद के एक्सएमएल बना सकते हैं:

static void Main(string[] args) 
    { 

     DataTable t = getStuff("test"); 

     var xml = new XElement("Main", from row in t.AsEnumerable() 
       select new XElement("firstlevel", 
        new XAttribute("a", row["a"]), 
        new XAttribute("b", row["b"]), 
        from row2 in getStuff(row["a"].ToString()).AsEnumerable() 
        select new XElement("secondlevel", 
         new XAttribute("a", row2["a"]), 
         new XAttribute("b", row2["b"]), 
         from row3 in getStuff(row2["a"].ToString()).AsEnumerable() 
         select new XElement("thirdlevel", 
          new XElement("a", row3["a"]), 
          new XElement("b", row3["b"]))))); 

     Console.WriteLine(xml.ToString()); 


    } 

    private static DataTable getStuff(string s) 
    { 
     Random r=new Random(s.GetHashCode()); 
     DataTable t = new DataTable(); 
     t.Columns.Add("a"); 
     t.Columns.Add("b"); 
     for (int i = 0; i < 2; i++) 
     { 
      t.Rows.Add (r.Next().ToString(), r.Next().ToString()); 
     } 
     return t; 
    } 
0

आप कारक अपने समाधान एक सा सब फंस WS कॉल से छुटकारा पाने के फिर से करना होगा। यह एक गंभीर प्रदर्शन डाउनर है।

0

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

यदि आप एक स्ट्रिंग पर लिख रहे हैं। इसे रोको, और एक धारा लिखें।

यदि आप एक buffered स्ट्रिंग पर लिख रहे हैं, तो बफर के आकार को देखें। यदि आप एएसपी.नेट पेज या हैंडलर से लिख रहे हैं, तो नियमित अंतराल पर Response.Flush() को कॉल करें।

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

इसलिए यहां सुधार के लिए दायरा हो सकता है, हालांकि वेबसाईट की कॉल से लाभ प्राप्त होने की संभावना है। हो सकता है कि यह भी सुधार किया जा सके, यदि आप webservice की प्रतिक्रिया के विश्लेषण को फिर से लिखते हैं ताकि yields आइटमों को पार्स किया जा सके, जिसका अर्थ है कि आप पूरी प्रतिक्रिया प्राप्त होने से पहले प्रतिक्रिया को संसाधित करना शुरू कर सकते हैं।

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