ein schneller Weg, um mehrere Dateien herunterladen

ich brauche zum herunterladen von über 2 Millionen Dateien aus der SEC-Webseite. jede Datei hat eine einmalige url und im Durchschnitt 10kB. dies ist meine aktuelle Umsetzung:

    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();
    }

die projizierte Uhrzeit ist 12 Tage... gibt es einen schnelleren Weg?

Edit: btw, ist der lokale Datei-handling dauert nur 7% der Zeit

Edit: dies ist meine Letzte Umsetzung:

    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 trans­port con­nec­tion: ") || 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;
    }
Kann nicht diese Dateien werden in einem Archiv zusammengefasst und heruntergeladen haben, in eine Einheit?
leider Nein.
Irgendeinem Grund Sie mit einem browser-Steuerelement anstelle einer WebRequest?
der Grund ist, dass ich bin ratlos über die Unterschiede...
Getestet habe ich mit einem sequenziellen WebRequest, es ist sogar um 30% langsamer

InformationsquelleAutor eyaler | 2012-01-15

Schreibe einen Kommentar