הורדה מהירה של קבצים מרובים C#
-
אני צריך להוריד כמות גדולה של קבצים מאתר מסוים.
אני משתמש בקוד הבא מכאןclass DownloadState { public readonly Uri Uri; public readonly string Filename; public readonly WebClient Client; public DownloadState(string u, string f, WebClient c) { Uri = new Uri(u); Filename = f; Client = c; } } const int MaxConcurrentDownloads = 6; BlockingCollection<string> UrlsToDownload = new BlockingCollection<string>(); // AddUrlsToDownload populates the UrlsToDownload collection. AddUrlsToDownload(UrlsToDownload); // Mark the collection as complete for adding. UrlsToDownload.CompleteAdding(); // Now, start the downloads. for (int i = 0; i < MaxConcurrentDownloads; ++i) { var client = new WebClient(); client.DownloadProgressChanged = DownloadProgressChanged; client.DownloadFileCompleted = DownloadFileCompleted; StartDownload(client); } void StartDownload(WebClient client) { string url; if (UrlsToDownload.TryTake()) { string fname = CreateDownloadFilename(url); var state = new DownloadState(url, fname, client); // start the asynchronous download. client.DownloadFileAsync(state.Uri, fname, state); } else { // Couldn't get a url. The queue is empty. // Dispose the WebClient instance. client.Dispose(); } }
בקוד הזה יש הגדרה לכמות ה client שיפעלו בו זמנית בצורה אסינכרונית, אבל גם כשאני מגדיר לו כמות גדולה מאוד של הורדות בו זמנית, וגם אם אוריד את ההגבלה הזו לגמרי, עדיין זה מתחיל את ההורדה במהירות של 7.5 KB לשניה ויורד ל 0.5 KB לשניה מה שעושה את ההורדה מאוד מאוד איטית... :roll:
הבנתי שזה הגבלה בשרת, איך אפשר לבדוק את זה, ומהם הפתרונות אם יש?שאלה נוספת:
אחרי שהקבצים יורדים אני מחלץ אותם וממיר אותם לפורמט אחר שנכנס ישירות לדטה בייס, ישנה אפשרות להשתמש ב DownloadDataAsync ולהוריד את הקובץ לתוך מערך byte ו'לטפל' בו מיידית בלי לשמור אותו כקובץ ורק אח"כ לפתוח את הקובץ, השאלה האם זה באמת חוסך זמן משמעותי ושווה את הבלגן שנוצר מהמערכים שצריכים להשמר עם שם הקובץ וכו'?תודה לכולם.
פורסם במקור בפורום CODE613 ב28/12/2015 22:38 (+02:00)