2009-05-23 13 views
19

मैं HttpWebResponse.GetResponse() और Streamreader.ReadToEnd() का उपयोग करके C# (केवल कुछ सौ साइटों के लिए) में सीमित वेब क्रॉलर को लागू करने का प्रयास कर रहा हूं, StreamReader का उपयोग करने का भी प्रयास किया। पढ़ें() और मेरी एचटीएमएल स्ट्रिंग बनाने के लिए एक पाश।HTTPWebResponse + StreamReader बहुत धीमा

मैं केवल उन पृष्ठों को डाउनलोड कर रहा हूं जो लगभग 5-10K हैं।

यह सब बहुत धीमी है! उदाहरण के लिए, औसत GetResponse() समय लगभग आधे सेकेंड है, जबकि औसत StreamREader.ReadToEnd() समय लगभग 5 सेकंड है!

सभी साइटें बहुत तेज़ी से होनी चाहिए, क्योंकि वे मेरे स्थान के बहुत करीब हैं, और तेज़ सर्वर हैं। (एक्सप्लोरर में डी/एल के लिए व्यावहारिक रूप से कुछ नहीं लेता है) और मैं किसी भी प्रॉक्सी का उपयोग नहीं कर रहा हूं।

माई क्रॉलर के पास एक ही साइट से एक साथ पढ़ने के बारे में 20 धागे हैं। क्या इससे कोई समस्या हो सकती है?

मैं StreamReader को कैसे कम कर सकता हूं। हाल ही में पढ़ें?

उत्तर

8

वेब क्लाइंट का डाउनलोडस्ट्रिंग HttpWebRequest के लिए एक साधारण रैपर है, क्या आप अस्थायी रूप से इसका उपयोग करने का प्रयास कर सकते हैं और देख सकते हैं कि गति में सुधार होता है या नहीं? अगर चीजें बहुत तेज हो जाती हैं, तो क्या आप अपना कोड साझा कर सकते हैं ताकि हम देख सकें कि इसके साथ क्या गलत हो सकता है?

संपादित करें:

ऐसा लगता है HttpWebRequest IE के 'अधिकतम समवर्ती कनेक्शन' सेटिंग का मानना ​​है, एक ही डोमेन इन URL कर रहे हैं? आप यह देखने के लिए कनेक्शन सीमा बढ़ाने की कोशिश कर सकते हैं कि क्या इससे मदद मिलती है? मैं this article समस्या के बारे में पाया:

डिफ़ॉल्ट रूप से, आप प्रदर्शन नहीं कर सकते अधिक से 2-3 async HttpWebRequest (ओएस पर निर्भर करता है)। आदेश में ओवरराइड करने के लिए यह (सबसे आसान तरीका है, IMHO) मत भूलना आवेदन के config फ़ाइल में धारा के तहत जोड़ने के लिए:

<system.net> 
    <connectionManagement> 
    <add address="*" maxconnection="65000" /> 
    </connectionManagement> 
</system.net> 
+0

WebClient का उपयोग कर की कोशिश की, एक ही परिणाम (औसत बार नहीं बदला है)। मुझे यह भी जिक्र करना चाहिए कि मेरे पास 180 केबीपीएस की औसत डी/एल गति के साथ 1.5 एमबीपीएस कनेक्शन है, मैं सोच रहा था कि शायद 20 धागे स्ट्रीमरडर को कॉल कर रहे हैं। उसी समय पढ़ें इसके साथ कुछ करने के लिए कुछ हो सकता है? या यह अप्रासंगिक है? – Roey

+0

मेरे अनुभव में, इस तरह के कनेक्शन पर आप बैंडविड्थ को 3-4 धागे से संतृप्त करेंगे। जब तक आप जिन वेबसाइटों को पिंग कर रहे हैं, तब तक और अधिक चलाने की आवश्यकता नहीं है जब तक कि आप पिंगिंग नहीं कर रहे हैं और आपके पास थ्रेड सो रहे हैं, I/O पर प्रतीक्षा कर रहे हैं। – kgriffs

+1

वाह !!! मैं प्रति सर्वर लगभग 300 धागे के साथ परीक्षण सर्वर लोड करने के लिए async HttpWebRequest का उपयोग कर रहा था और प्रत्येक थ्रेड "क्रमशः" डाउनलोड कर रहा था। बदलते अधिकतम कनेक्शन सेटिंग प्रत्येक थ्रेड डाउनलोड डेटा 10x तेज बना दिया। –

15

HttpWebRequest अपने proxy settings पता लगाने के लिए कुछ समय लग रहा हो सकता है । आपके आवेदन config को यह जोड़ने का प्रयास करें:

<system.net> 
    <defaultProxy enabled="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 

तुम भी बफरिंग अपने अंतर्निहित ऑपरेटिंग सिस्टम सॉकेट की जाने वाली कॉल की संख्या को कम करने के लिए पढ़ता से एक मामूली प्रदर्शन लाभ देख सकते हैं:

using (BufferedStream buffer = new BufferedStream(stream)) 
{ 
    using (StreamReader reader = new StreamReader(buffer)) 
    { 
    pageContent = reader.ReadToEnd(); 
    } 
} 
+0

धन्यवाद! यह पूरी तरह से सेकंड से मिलीसेकंड तक मेरे कोड को तेज कर दिया! –

+0

सी ++ में समकक्ष कोड क्या है? उपयोग (...) C++ – Edge

1

आप शामिल हैं ServicePointManager.maxConnections की कोशिश की? मैं आमतौर पर इसे इसी तरह की चीजों के लिए 200 पर सेट करता हूं।

1

मुझे एक ही समस्या थी लेकिन सबसे खराब समस्या थी। प्रतिक्रिया = (HttpWebResponse) webRequest.GetResponse(); मेरे कोड में अधिक कोड चलाने से पहले लगभग 10 सेकंड में देरी हुई और इसके बाद डाउनलोड ने मेरा कनेक्शन संतृप्त किया।

कर्ट के जवाब defaultProxy सक्षम = "false"

समस्या हल हो।अब प्रतिक्रिया लगभग तुरंत है और मैं अपने कनेक्शन पर किसी भी http फ़ाइल को अधिकतम गति डाउनलोड कर सकता हूं :) खराब अंग्रेजी के लिए खेद है

1

मुझे पता चला कि एप्लिकेशन कॉन्फ़िगर विधि काम नहीं करती है, लेकिन समस्या अभी भी प्रॉक्सी सेटिंग्स के कारण थी। मेरे सरल, 30 सेकंड तक ले जाते थे अनुरोध अब यह 1.

public string GetWebData() 
{ 
      string DestAddr = "http://mydestination.com"; 
      System.Net.WebClient myWebClient = new System.Net.WebClient(); 
      WebProxy myProxy = new WebProxy(); 
      myProxy.IsBypassed(new Uri(DestAddr)); 
      myWebClient.Proxy = myProxy; 
      return myWebClient.DownloadString(DestAddr); 
} 
4

मैं एक ही समस्या थी लेता है, लेकिन जब मैं शून्य पर HttpWebRequest के प्रॉक्सी पैरामीटर बैठे थे, यह समस्या हल हो।

UriBuilder ub = new UriBuilder(url); 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ub.Uri); 
request.Proxy = null; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
+0

ग्रेट समाधान में काम नहीं करता है! मेरे लिये कार्य करता है। –

0

उत्तर के लिए सभी को धन्यवाद, उन्होंने मुझे उचित दिशा में खोदने में मदद की है। हालांकि प्रस्तावित आवेदन कॉन्फ़िग फ़ाइल को बदलने के लिए (के रूप में मैं समझ गया कि समाधान वेब अनुप्रयोगों के लिए है) मेरी जरूरतों से मेल नहीं खाती समाधान मैं, एक ही प्रदर्शन मुद्दे के साथ सामना किया है, मेरी समाधान नीचे दिखाया गया है:

HttpWebRequest webRequest; 

webRequest = (HttpWebRequest)System.Net.WebRequest.Create(fullUrl); 
webRequest.Method = WebRequestMethods.Http.Post; 

if (useDefaultProxy) 
{ 
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy; 
    webRequest.Credentials = CredentialCache.DefaultCredentials; 
} 
else 
{ 
    System.Net.WebRequest.DefaultWebProxy = null; 
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy; 
} 
0

क्यों इस मुद्दे को हल करने के लिए multithreading नहीं होगा? मल्टीथ्रेडिंग नेटवर्क प्रतीक्षा समय को कम कर देगी, और चूंकि आप सिस्टम मेमोरी (रैम) में बफर की सामग्री संग्रहीत करेंगे, इसलिए फाइल सिस्टम से निपटने से कोई आईओ बाधा नहीं होगी। इस प्रकार, आपके 82 पृष्ठ जो डाउनलोड करने और पार्स करने के लिए 82 सेकंड लेते हैं, उन्हें 15 सेकंड (4x प्रोसेसर मानते हुए) लेना चाहिए। अगर मुझे कुछ याद आ रहा है तो मुझे सही करो।

____ डाउनलोड थ्रेड _____ *

डाउनलोड सामग्री

फार्म स्ट्रीम

पढ़ें सामग्री

_________________________ *

+0

ओपी पहले ही बताता है कि "लगभग 20" धागे का उपयोग किया जाता है। – Spooky

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