मुझे एसईसी वेबसाइट से लगभग 2 मिलियन फाइलें डाउनलोड करने की आवश्यकता है। प्रत्येक फाइल में एक अद्वितीय यूआरएल होता है और औसत 10kb पर होता है। यह मेरा वर्तमान कार्यान्वयन है:एकाधिक फ़ाइलों को डाउनलोड करने का एक तेज़ तरीका
List<string> urls = new List<string>();
// ... initialize urls ...
WebBrowser browser = new WebBrowser();
foreach (string url in urls)
{
browser.Navigate(url);
while (browser.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();
StreamReader sr = new StreamReader(browser.DocumentStream);
StreamWriter sw = new StreamWriter(), url.Substring(url.LastIndexOf('/')));
sw.Write(sr.ReadToEnd());
sr.Close();
sw.Close();
}
अनुमानित समय लगभग 12 दिन है ... क्या कोई तेज़ तरीका है?
संपादित करें: यह मेरा अंतिम कार्यान्वयन है:
कई धागे मेंvoid Main(void)
{
ServicePointManager.DefaultConnectionLimit = 10000;
List<string> urls = new List<string>();
// ... initialize urls ...
int retries = urls.AsParallel().WithDegreeOfParallelism(8).Sum(arg => downloadFile(arg));
}
public int downloadFile(string url)
{
int retries = 0;
retry:
try
{
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
webrequest.Timeout = 10000;
webrequest.ReadWriteTimeout = 10000;
webrequest.Proxy = null;
webrequest.KeepAlive = false;
webresponse = (HttpWebResponse)webrequest.GetResponse();
using (Stream sr = webrequest.GetResponse().GetResponseStream())
using (FileStream sw = File.Create(url.Substring(url.LastIndexOf('/'))))
{
sr.CopyTo(sw);
}
}
catch (Exception ee)
{
if (ee.Message != "The remote server returned an error: (404) Not Found." && ee.Message != "The remote server returned an error: (403) Forbidden.")
{
if (ee.Message.StartsWith("The operation has timed out") || ee.Message == "Unable to connect to the remote server" || ee.Message.StartsWith("The request was aborted: ") || ee.Message.StartsWith("Unable to read data from the transport connection: ") || ee.Message == "The remote server returned an error: (408) Request Timeout.") retries++;
else MessageBox.Show(ee.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
goto retry;
}
}
return retries;
}
क्या इन फ़ाइलों को एक संग्रह में जोड़ा जा सकता है और एक इकाई में डाउनलोड किया जा सकता है? – Oded
दुर्भाग्य से नहीं। – eyaler
किसी भी कारण से आप 'WebRequest' के बजाय ब्राउज़र नियंत्रण का उपयोग कर रहे हैं? – CodesInChaos